0

私が取り組んでいるコードベースでは、json でシリアル化される最も一般的なオブジェクトには 3 つのフィールドがあります。これらのフィールドのいずれかの値は、常にではありませんが、多くの場合、null です。

値がnullの場合、jsonビルドでフィールドを送信しないように求められました。そして、私はそれを行う方法がわかりません。私が知っている JsonFX 注釈では、値に関係なくフィールドを無視するか (JsonIgnore)、フィールドの値を変換する ( JsonName と properties を使用) ことしかできません。

4

1 に答える 1

1

すべてのタイプのすべてのプロパティとフィールドに対して null を無条件にスキップする場合は、 (またはIResolverStrategyである可能性が高い) をサブクラス化し、 をオーバーライドして、null 値をスキップするデリゲートを返すことができます。JsonResolverStrategyPocoResolverStrategyGetValueIgnoredCallback(MemberInfo member)

public class SkipNullJsonResolverStrategy : JsonResolverStrategy // Or PocoResolverStrategy
{
    public override ValueIgnoredDelegate GetValueIgnoredCallback(MemberInfo member)
    {
        Type type;
        if (member is PropertyInfo)
            type = ((PropertyInfo)member).PropertyType;
        else if (member is FieldInfo)
            type = ((FieldInfo)member).FieldType;
        else
            type = null;

        var baseValueIgnored = base.GetValueIgnoredCallback(member);
        if (type != null && (!type.IsValueType || Nullable.GetUnderlyingType(type) != null))
        {
            return (ValueIgnoredDelegate)((instance, memberValue) => (memberValue == null || (baseValueIgnored != null && baseValueIgnored(instance, memberValue))));
        }
        else
        {
            return baseValueIgnored;
        }
    }
}

次に、次のように使用します。

        var settings = new DataWriterSettings(new SkipNullJsonResolverStrategy());
        var writer = new JsonWriter(settings);

        var json = writer.Write(rootObject);

選択したプロパティの null のみをスキップする場合は、JsonResolverStrategy(またはサブクラス) を使用してから、次のいずれかを行う必要があります。

例えば:

public class ExampleClass
{
    [JsonSpecifiedProperty("NameSpecified")]
    public string Name { get; set; }

    bool NameSpecified { get { return Name != null; } }

    [DefaultValue(null)]
    public int? NullInteger { get; set; }

    [DefaultValue(null)]
    public DateTime? NullableDateTime { get; set; }
}
于 2015-10-27T00:41:42.990 に答える