JSON到C#——列出JSON中没有子字段名称的字段?
使用Json.net(Newtonsoft.Json),我如何定义一个C#类(或多个类)来处理下面的Json “数据”字段似乎是级别/描述子字段的列表,但请注意,它们前面没有字段名JSON到C#——列出JSON中没有子字段名称的字段?,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,使用Json.net(Newtonsoft.Json),我如何定义一个C#类(或多个类)来处理下面的Json “数据”字段似乎是级别/描述子字段的列表,但请注意,它们前面没有字段名 { "status": "error", "data": [ { "warning" : "your input was wrong" } ], "error": [ { "373": "Error description goes here"
{
"status": "error",
"data": [
{
"warning" : "your input was wrong"
}
],
"error": [
{
"373": "Error description goes here"
}
]
}
“error”字段似乎是错误编号/错误消息子字段的列表,但请注意,它们前面也不是字段名
{
"status": "error",
"data": [
{
"warning" : "your input was wrong"
}
],
"error": [
{
"373": "Error description goes here"
}
]
}
该类定义不生成解析错误;然而,数据和错误的内容是不正确的
public class ApiResponse
{
[JsonProperty(PropertyName = "status")]
public string Status;
[JsonProperty(PropertyName = "data")]
public IEnumerable<KeyValuePair<string, string>> Data;
[JsonProperty(PropertyName = "error")]
public IEnumerable<KeyValuePair<int, string>> Errors;
};
// this doesn't throw a parsing exception, but the resulting
// Data and Errors fields are not correctly populated.
var x = JsonConvert.DeserializeObject<ApiResponse>(SampleJson);
公共类响应
{
[JsonProperty(PropertyName=“status”)]
公共字符串状态;
[JsonProperty(PropertyName=“data”)]
公共数字数据;
[JsonProperty(PropertyName=“error”)]
公共数字错误;
};
//这不会引发解析异常,但会导致
//数据和错误字段未正确填充。
var x=JsonConvert.DeserializeObject(SampleJson);
感谢您的帮助。您创建的课程没有什么问题。根据提供JSON,您应该创建类似于以下代码的类
public class Data
{
[JsonProperty(PropertyName = "warning")]
public string Warning { get; set; }
}
public class Error
{
[JsonProperty(PropertyName = "373")]
public string Col_373 { get; set; }
}
public class ApiResponse
{
[JsonProperty(PropertyName = "status")]
public string Status { get; set; }
[JsonProperty(PropertyName = "data")]
public List<Data> Data { get; set; }
[JsonProperty(PropertyName = "error")]
public List<Error> Error { get; set; }
}
公共类数据
{
[JsonProperty(PropertyName=“warning”)]
公共字符串警告{get;set;}
}
公共类错误
{
[JsonProperty(PropertyName=“373”)]
公共字符串Col_373{get;set;}
}
公开课回应
{
[JsonProperty(PropertyName=“status”)]
公共字符串状态{get;set;}
[JsonProperty(PropertyName=“data”)]
公共列表数据{get;set;}
[JsonProperty(PropertyName=“error”)]
公共列表错误{get;set;}
}
一旦您设计了这样的结构,您就可以按照下面的代码片段将其返回到您的对象结构。您似乎对属性名称和值感到困惑
string json = "{\"status\":\"error\", \"data\": [{\"warning\" : \"your input was wrong\" }], \"error\": [{\"373\": \"Error description goes here\"}]}";
var res = JsonConvert.DeserializeObject<ApiResponse>(json);
string json=“{\”状态\“:\”错误\“,\”数据\“:[{\”警告\“:\”输入错误\“}],\”错误\“:[{\”373\“:\”错误描述在这里\“}];
var res=JsonConvert.DeserializeObject(json);
再观察一次
“373”:“此处有错误说明”
请不要使用number作为键/列名。尝试将
数据和错误定义为字典的IEnumerables,而不是KeyValuePairs的IEnumerables。(Json.Net希望KeyValuePairs在Json中表示为具有显式Key
和Value
属性的对象,而这些属性不是您所拥有的。)
Fiddle:这可能会对您有所帮助:我不确定OP是否能控制JSON——这可能是第三方API。在这种情况下,如果错误代码恰好不是373
,或者数据不是警告
,则解决方案将不起作用。您需要能够处理变量键名称的东西。@BrianRogers您是对的,我不控制JSON。@Tony看看我的答案;它应该与JSON一起使用,并且可以处理变量密钥名。切换到使用字典比使用KeyValuePair效果更好。我对使用Dictionary的担心是,数据字段看起来好像可能有多个“警告”。“错误”字段似乎非常适合,因为我假设错误号只会出现一次。它仍然适用于此结构。使用SelectMany
将允许您获取所有内容,而不管每个数组中有多少词典或每个词典中有多少条目。提琴手:我现在明白了。我想那只是一本字典。它不是,它是一个IEnumerable。基本上是单条目词典的列表。谢谢
var x = JsonConvert.DeserializeObject<ApiResponse>(SampleJson);
foreach (var kvp in x.Data.SelectMany(d => d))
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
foreach (var kvp in x.Errors.SelectMany(d => d))
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}