【问题标题】:How to avoid sending null fields with JsonFX如何避免使用 JsonFX 发送空字段
【发布时间】:2015-10-27 10:36:35
【问题描述】:

在我正在使用的代码库中,最常见的 json 序列化对象有 3 个字段。这些字段之一的值通常(但不总是)为空。

如果它的值为空,我被要求避免在 json 构建中发送该字段。而且我不知道该怎么做。我知道的 JsonFX 注释只允许忽略一个字段,无论其值如何(JsonIgnore),或转换字段的值(使用 JsonName 和属性)

【问题讨论】:

    标签: c# json serialization jsonfx


    【解决方案1】:

    如果你想无条件地跳过所有类型的所有属性和字段的空值,你可以继承你的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(或子类),然后

    例如:

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

    【讨论】:

    • 您使用的是 JsonFx v1 还是 v2?如果是 v2,那么@dbc 提供了多种好方法。如果使用 v1,则使用[DefaultValueAttribute(null)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2017-08-27
    • 2018-05-16
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多