首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免使用JsonFX发送空字段

如何避免使用JsonFX发送空字段
EN

Stack Overflow用户
提问于 2015-10-26 19:42:26
回答 1查看 460关注 0票数 0

在我正在使用的代码库中,用json序列化的最常见的对象有3个字段。其中一个字段的值通常为null,但并非总是为null。

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

EN

回答 1

Stack Overflow用户

发布于 2015-10-27 08:41:43

如果您想要无条件地跳过所有类型的所有属性和字段的空值,您可以子类化IResolverStrategy (可能是JsonResolverStrategyPocoResolverStrategy),重写GetValueIgnoredCallback(MemberInfo member),并返回一个跳过空值的委托:

代码语言:javascript
复制
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;
        }
    }
}

然后像这样使用它:

代码语言:javascript
复制
        var settings = new DataWriterSettings(new SkipNullJsonResolverStrategy());
        var writer = new JsonWriter(settings);

        var json = writer.Write(rootObject);

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

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

例如:

代码语言:javascript
复制
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; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33344902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档