【问题标题】:JsonConvert.DeserializeObject<T> doesn't take into account property names [duplicate]JsonConvert.DeserializeObject<T> 不考虑属性名称[重复]
【发布时间】:2018-07-30 01:38:08
【问题描述】:

我有一个简单的类,我想将一个 json 字符串反序列化为:

public class ConnectClientResponse
{
    public bool result { get; set; }
}

反序列化方法的调用:

try
{
    var response = JsonConvert.DeserializeObject<ConnectClientResponse>(jsonString);
}
catch (JsonSerializationException)
{
    // Exception should be thrown
}

问题是当json字符串与ConnectClientResponse类的形式相同但属性名称不一样时,不会抛出异常。

这是正常行为吗?如果是这样,如何检查属性名称是否相同?

无效 json 示例,属性名称与 ConnectClientResponse“结果”属性名称不匹配:

{
    "test" : true
}

【问题讨论】:

标签: c# json json.net deserialization


【解决方案1】:

您的实际问题不是存在“相似”属性,而是您的属性不是强制性的。

如果您希望某些属性是强制性的,请使用 JsonProperty 属性对其进行标记,例如[JsonProperty(Required = Required.Always)]。您也可以使用值 Required.AllowNull 代替,如果空值应该是有效的,只要属性名称存在。

【讨论】:

  • [JsonProperty(Required = Required.Always)] 和使用 MissingMemberHandling 之间的最佳实践是什么?我测试了他们两个,他们解决了我的问题。
  • @Valsov - 他们做不同的、互补的事情。 MissingMemberHandling 在 JSON 中的一个额外的未知属性上引发异常。 Required = Required.Always 在 JSON 中的缺失属性中引发异常。在您的 JSON 中,您有两个问题。
【解决方案2】:

您可以使用 JsonSerializerSettings 上的 MissingMemberHandling 来控制此行为。 https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_MissingMemberHandling.htm

【讨论】:

  • 这正是我想要的。谢谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多