【问题标题】:How do I parse json objects so that I can get all the values correctly如何解析 json 对象以便正确获取所有值
【发布时间】:2020-11-30 15:11:22
【问题描述】:

所以我得到了如下 JSON 字符串:

{"success":false,"errors":[{"name":["Username "admin" has already been taken."],"email":["Email is not a valid email address."]}],"data":[]}

或者,更易读:

{
  "success": false,
  "errors": [
    {
      "name": [
        "Username "admin" has already been taken."
      ],
      "email": [
        "Email is not a valid email address."
      ]
    }
  ],
  "data": []
}

并且我想以一种无论错误名称或值如何都可以获取“错误”中的所有项目的方式对其进行解析。因为“错误”中的对象并不总是“名称”和“电子邮件”,所以可能会有不同的对象,但它们的结构总是如此。

我设法做到了这一点:

var theObject = (JObject)JsonConvert.DeserializeObject(theJsonString);

我们的目标是把它变成一个字典,在那里我可以得到错误的名称和值。或者只是名称和值作为一个字符串也可以。

基本上是获取所有错误的集合。

更新

我尝试将其反序列化为它自己的对象

var theObject = JsonConvert.DeserializeObject<ResponseObject>(responseString);

模型看起来像这样的地方

public class ResponseObject
{
    [JsonProperty("success")]
    public bool Success { get; set; }

    //[JsonProperty("errors")]
    //public Error[] Errors { get; set; }
    [JsonProperty("errors")]
    public Dictionary<string, List<string>> errors { get; set; }

    [JsonProperty("data")]
    public object[] Data { get; set; }
}

然后抛出此错误

{"无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary2[System.String,System.Collections.Generic.List1[System.String]]' 因为该类型需要一个 JSON 对象(例如 {"name":"value"}) 正确反序列化。\r\n要修复此错误,请将 JSON 更改为 一个 JSON 对象(例如 {"name":"value"})或更改反序列化的 类型为数组或实现集合接口的类型 (例如 ICollection、IList),例如可以从 JSON 数组。 JsonArrayAttribute 也可以添加到类型来强制 它从 JSON 数组反序列化。\r\nPath 'errors',第 1 行, 第 27 位。"}

【问题讨论】:

  • 字典很可能是您的朋友,正如您所提到的。究竟有什么困难?
  • 您需要一个具有“错误”属性的类,如下所示:public Dictionary&lt;string, List&lt;string&gt;&gt; errors {get; set;}
  • @Fildor 我不太明白
  • Fildor 的意思是,不是反序列化为 JObject,而是将您自己的类反序列化为该类(有点像这里的示例:newtonsoft.com/json/help/html/DeserializeObject.htm)并将其作为属性之一。
  • @ADyson 哦!是的,我试过了,但我遇到了一个例外,我将它添加到这个问题的更新版本中

标签: c# json .net json.net


【解决方案1】:

错误是List&lt;Dictionary&lt;string, List&lt;string&gt;&gt;&gt;
它看起来像这样:

"errors": [ <--
    {
      "1": [
        "Username &quot;admin&quot; has already been taken."
      ],
      "2": [
        "Email is not a valid email address."
      ]
    }
] <--
,

不是Dictionary&lt;string, List&lt;string&gt;&gt; 会像这样:

"errors": 
    {
      "1": [
        "Username &quot;admin&quot; has already been taken."
      ],
      "2": [
        "Email is not a valid email address."
      ]
    },

【讨论】:

    【解决方案2】:

    一个简单的解决方案是:

    如果你有 Visual Studio 打开它。

    1. 复制你的 Json 代码。
    2. 点击它,它会自动为您生成代码:) click here

    编辑 -> 导入 Json

    祝你好运! :) 有时他可能会选择“假”数据类型,但在你的小 json 上你会没事的。

    这将是输出:

    public class Rootobject
        {
            public bool success { get; set; }
            public Error[] errors { get; set; }
            public object[] data { get; set; }
        }
    
        public class Error
        {
            public string[] name { get; set; }
            public string[] email { get; set; }
        }
    

    【讨论】:

    • OP 专门说错误的内容不会总是“name”和“email”。有时会有不同的属性。这就是问题的全部意义所在。所以简单地硬编码属性名称是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2017-08-12
    • 2013-10-14
    相关资源
    最近更新 更多