加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在Json.NET中将缺少的属性反序列化为默认值?

发布时间:2020-12-16 19:32:16 所属栏目:百科 来源:网络整理
导读:我有一个用DataContract和DataMember属性注释的类.某些成员被标记为DataMember(IsRequired = true).当我从Json.NET通过线路序列化实例,并且所需的对象成员具有null值时,它们的序列化值在输出中丢失(这显然相当于在 JSON中为null).我没关系. 我创建了一种“ec
我有一个用DataContract和DataMember属性注释的类.某些成员被标记为DataMember(IsRequired = true).当我从Json.NET通过线路序列化实例,并且所需的对象成员具有null值时,它们的序列化值在输出中丢失(这显然相当于在 JSON中为null).我没关系.

我创建了一种“echo”服务,它返回作为响应发送给它的数据.因此,此服务接收具有缺少成员的JSON(或根据您的查看方式为null成员),然后将其发送回我的Json.NET客户端.通过Fiddler(代理嗅探器)查看,线路上的JSON在两个方向上看起来都是一样的.到现在为止还挺好.

当原始Json.NET发送方收到JSON响应以反序列化它时,序列化程序抛出一个关于在JSON有效负载中找不到所需成员的异常:

Required property 'IAmRequired' not found in JSON. Path ''.

这是不幸的,因为序列化程序因此无法反序列化它之前已经序列化的数据而没有问题.

如果没有更改DataContract类以使成员不需要(由于多种原因我不想这样做),有没有办法让Json.NET将缺少的成员反序列化为默认值,例如null?

这是我的反序列化代码:

HasRequired h = null;
JObject json = response as JObject; // hand waving here
try
{
    JsonSerializer ser = new JsonSerializer();
    ser.MissingMemberHandling = MissingMemberHandling.Ignore; // doesn't seem to help
    ser.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate; // doesn't seem to help
    ser.NullValueHandling = NullValueHandling.Include; // doesn't seem to help
    h = json.ToObject<HasRequired>(ser);
}
catch (Exception ex)
{
    // bummer,missing required members still
}
如果您的属性标有[DataMember(Required = true)]并且您想要覆盖所需的行为,那么您可以执行以下操作:

>您可以使用[JsonProperty(Required = Required.Default)]标记这些相同的属性.这是有效的,因为[JsonProperty]优先于Json.Net中的[DataMember].

[DataContract]
public class HasRequired
{
    [DataMember(Required = true)]
    [JsonProperty(Required = Required.Default)]
    public string IAmRequired { get; set; }
}

>或者,您可以创建一个自定义ContractResolver,以编程方式在每个属性上设置Required = Required.Default.

class CustomResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member,memberSerialization);
        prop.Required = Required.Default;
        return prop;
    }
}

要使用解析程序,只需将序列化程序上的ContractResolver属性设置为自定义解析程序的新实例:

JsonSerializer ser = new JsonSerializer();
ser = new CustomResolver();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读