如何避免发送空字段与JsonFX

本文关键字:字段 JsonFX 何避免 | 更新日期: 2023-09-27 18:19:12

在我正在工作的代码库中,在json中序列化的最常见对象有3个字段。其中一个字段的值经常是空的,但不总是空的。

我被要求避免发送字段在json构建,如果它的值为空。我不知道该怎么做。我所知道的JsonFX注解只允许忽略字段的值(JsonIgnore),或者转换字段的值(使用JsonName和properties)

如何避免发送空字段与JsonFX

如果您想无条件跳过所有类型的所有属性和字段的空值,您可以子类化您的IResolverStrategy(可能是JsonResolverStrategyPocoResolverStrategy),覆盖GetValueIgnoredCallback(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);

如果您只想跳过所选属性的空值,则需要使用JsonResolverStrategy(或子类),然后

  • 在属性上设置[DefaultValue(null)], OR

  • 在属性上设置[JsonSpecifiedProperty(string methodName)],指定另一个属性的名称,当要跳过该属性时返回false

例如:

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; }
}