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

时间:2016-06-15 14:13:30

标签: 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"
    }
  ]
}

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

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);

任何帮助都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分: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;
};

然后,您可以使用带foreach的{​​{1}}循环读取数据:

SelectMany

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

答案 1 :(得分:-1)

您创建的课程几乎没有问题。根据提供的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; }
    }

设计完这样的结构后,您可以随时将其恢复为对象结构,如下面的代码片段所示。看来,你对属性名称和值感到困惑。

 string json = "{\"status\":\"error\", \"data\": [{\"warning\" : \"your input was wrong\" }],  \"error\": [{\"373\": \"Error description goes here\"}]}";

 var res = JsonConvert.DeserializeObject<ApiResponse>(json);

再观察一次。

  

&#34; 373&#34; :&#34;错误说明在这里&#34;

请不要使用数字作为键/列名称。