JSON到C# - 在json中列出没有子字段名称的字段?

Ton*_*ony 5 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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

此类定义不会生成解析错误; 但是数据和错误的内容不正确.

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);
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,谢谢.

Bri*_*ers 4

尝试将您的DataErrors成员定义为字典的 IEnumerables,而不是 KeyValuePairs 的 IEnumerables。(Json.Net 期望 KeyValuePairs 在 JSON 中表示为具有显式属性的对象KeyValue而这不是您所拥有的。)

public class ApiResponse
{
    [JsonProperty(PropertyName = "status")]
    public string Status;

    [JsonProperty(PropertyName = "data")]
    public IEnumerable<Dictionary<string, string>> Data;

    [JsonProperty(PropertyName = "error")]
    public IEnumerable<Dictionary<int, string>> Errors;
};
Run Code Online (Sandbox Code Playgroud)

foreach然后,您可以使用循环读取数据SelectMany

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);
}
Run Code Online (Sandbox Code Playgroud)

小提琴: https: //dotnetfiddle.net/KJuAPu