Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解析json对象以便正确获取所有值_C#_Json_.net_Json.net - Fatal编程技术网

C# 如何解析json对象以便正确获取所有值

C# 如何解析json对象以便正确获取所有值,c#,json,.net,json.net,C#,Json,.net,Json.net,所以我得到了这个JSON字符串,它看起来像这样: {"success":false,"errors":[{"name":["Username "admin" has already been taken."],"email":["Email is not a valid email address."]}],"data":

所以我得到了这个JSON字符串,它看起来像这样:

{"success":false,"errors":[{"name":["Username "admin" has already been taken."],"email":["Email is not a valid email address."]}],"data":[]}
"errors": [ <--
    {
      "1": [
        "Username &quot;admin&quot; has already been taken."
      ],
      "2": [
        "Email is not a valid email address."
      ]
    }
] <--
,
或者,更通俗地说:

{
  "success": false,
  "errors": [
    {
      "name": [
        "Username &quot;admin&quot; has already been taken."
      ],
      "email": [
        "Email is not a valid email address."
      ]
    }
  ],
  "data": []
}
我想用一种方式来解析它,在这种方式下,我可以得到“errors”中的所有项,无论错误的名称或值是什么。因为“errors”中的对象并不总是“name”和“email”,可能会有不同的对象,但它们的结构总是这样的

我设法做到了这一点:

var theObject = (JObject)JsonConvert.DeserializeObject(theJsonString);
目标是把它编入字典,在那里我可以得到错误的名称和值。或者将名称和值作为一个字符串也可以使用

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

更新

我试着将它反序列化到它自己的对象中

var theObject = JsonConvert.DeserializeObject<ResponseObject>(responseString);
var theObject=JsonConvert.DeserializeObject(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; }
}
公共类响应对象
{
[JsonProperty(“成功”)]
公共bool成功{get;set;}
//[JsonProperty(“错误”)]
//公共错误[]错误{get;set;}
[JsonProperty(“错误”)]
公共字典错误{get;set;}
[JsonProperty(“数据”)]
公共对象[]数据{get;set;}
}
然后抛出这个错误

{“无法将当前JSON数组(例如[1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary
2[System.String,System.Collections.Generic.List
1[System.String]' 因为该类型需要一个JSON对象(例如{“name”:“value”})来 正确反序列化。\r\n若要修复此错误,请将JSON更改为 JSON对象(例如{“name”:“value”})或更改反序列化的 类型设置为数组或实现集合接口的类型 (例如,ICollection,IList)类似于列表,可以从 JSON数组.JsonArrayAttribute也可以添加到要强制的类型中 无法从JSON数组反序列化。\r\n路径“错误”,第1行, 立场27。”}


一个简单的解决方案是:

如果你有VisualStudio打开它

  • 复制你的Json代码
  • 单击此按钮,它会自动为您生成代码:)
  • 编辑->导入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; }
        }
    
    错误是一个
    列表

    看起来是这样的:

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

    正如你所提到的,字典很可能是你在这里的朋友。到底有什么困难?您需要一个具有如下属性“errors”的类:
    公共字典errors{get;set;}
    @Fildor我不太明白,Fildor的意思是,与其反序列化到JObject,不如将您自己的类反序列化到该类(有点像这里的示例:),并将其作为属性之一。@ADyson Oh!是的,我试过了,我得到了一个例外,我把它添加到了这个问题的更新版本中。我特别说,错误的内容并不总是“姓名”和“电子邮件”。有时会有不同的属性。这就是问题的关键所在。因此,简单地硬编码属性名称是不正确的。