【发布时间】: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.Dictionary
2[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<string, List<string>> errors {get; set;} -
@Fildor 我不太明白
-
Fildor 的意思是,不是反序列化为 JObject,而是将您自己的类反序列化为该类(有点像这里的示例:newtonsoft.com/json/help/html/DeserializeObject.htm)并将其作为属性之一。
-
@ADyson 哦!是的,我试过了,但我遇到了一个例外,我将它添加到这个问题的更新版本中