C# 如何解析json对象以便正确获取所有值
所以我得到了这个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":
{"success":false,"errors":[{"name":["Username "admin" has already been taken."],"email":["Email is not a valid email address."]}],"data":[]}
"errors": [ <--
{
"1": [
"Username "admin" has already been taken."
],
"2": [
"Email is not a valid email address."
]
}
] <--
,
或者,更通俗地说:
{
"success": false,
"errors": [
{
"name": [
"Username "admin" 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.Dictionary2[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打开它
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 "admin" has already been taken."],"email":["Email is not a valid email address."]}],"data":[]}
"errors": [ <--
{
"1": [
"Username "admin" has already been taken."
],
"2": [
"Email is not a valid email address."
]
}
] <--
,
正如你所提到的,字典很可能是你在这里的朋友。到底有什么困难?您需要一个具有如下属性“errors”的类:
公共字典errors{get;set;}
@Fildor我不太明白,Fildor的意思是,与其反序列化到JObject,不如将您自己的类反序列化到该类(有点像这里的示例:),并将其作为属性之一。@ADyson Oh!是的,我试过了,我得到了一个例外,我把它添加到了这个问题的更新版本中。我特别说,错误的内容并不总是“姓名”和“电子邮件”。有时会有不同的属性。这就是问题的关键所在。因此,简单地硬编码属性名称是不正确的。