gpt4 book ai didi

json.net - 如何将 Json.NET 中缺失的属性反序列化为默认值?

转载 作者:行者123 更新时间:2023-12-02 21:31:51 32 4
gpt4 key购买 nike

我有一个用 DataContract 和 DataMember 属性注释的类。某些成员被标记为 DataMember(IsRequired = true)。当我通过 Json.NET 线路序列化实例时,所需的对象成员具有 null 值,那么它们的序列化值在输出中丢失(这显然相当于 JSON 中的 null)。我对此表示同意。

我创建了一种“回显”服务,它返回发送给它的数据作为响应。因此,此服务接收缺少成员(或空成员,具体取决于您如何看待它)的 JSON,然后将其直接发送回我的 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)] 的属性,并且您想要覆盖所需的行为,您可以执行以下操作:

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

    [DataContract]
    public class HasRequired
    {
    [DataMember(Required = true)]
    [JsonProperty(Required = Required.Default)]
    public string IAmRequired { get; set; }
    }
  2. 或者,您可以创建一个自定义 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();

关于json.net - 如何将 Json.NET 中缺失的属性反序列化为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535858/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com