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"

使用Json.net(Newtonsoft.Json),我如何定义一个C#类(或多个类)来处理下面的Json

“数据”字段似乎是级别/描述子字段的列表,但请注意,它们前面没有字段名

{
  "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);
}