【问题标题】:JSON Deserialize with empty field c#JSON反序列化与空字段c#
【发布时间】:2016-04-21 22:24:26
【问题描述】:

我正在 c# 中测试一些 api 调用并得到以下 JSON 响应:

{
  "message": "The request is invalid. Model validation failed.",
  "validationErrors": {
    "": {
      "reasons": [
        "A customer must be added to the order before it can be placed."
      ]
    }
  }
}

我想将此响应映射到带有 JSON Deserializer 的类,但我无法控制响应的形成方式。如何处理validationErrors 中的那个空字段,以便我仍然可以访问我的对象中的原因列表?

注意:当我通过 json2csharp 运行它时,它为validationErrors 类中的该字段提供了这个不太有用的映射。

public __invalid_type__ __invalid_name__ {get;set;}

【问题讨论】:

    标签: c# json deserialization json-deserialization


    【解决方案1】:

    反序列化为Dictionary<string, ValidationError>:

    public class ValidationError
    {
        public List<string> reasons { get; set; }
    }
    
    public class RootObject
    {
        public string message { get; set; }
        public Dictionary<string, ValidationError> validationErrors { get; set; }
    }
    

    这将与 一起使用。如果您使用的是DataContractJsonSerializer(标记为),则需要设置DataContractJsonSerializer.UseSimpleDictionaryFormat = true(仅限.Net 4.5 及更高版本)。

    【讨论】:

    • 成功了!使用空键访问值并不是我最喜欢的事情,但 api 开发人员对此有过错,而不是你。
    【解决方案2】:

    如果你有你自己的类,你想去实现化,你可以尝试使用Newtonsoft-Json通过JsonPropertyAttribute来配置你的Json属性名称,并将其设置为:

    public class YourModel
    {
        [JsonProperty(name = "")
        public ValidationErrors { get; set; }
    }
    

    更多示例在这里 - link

    或者,您可以将您的属性取消实现为Dictionary&lt;string, YourErrorObject&gt;,并使用第一个项目来访问错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多