JSON到C# - 列出了JSON中没有子场名称的字段



使用json.net(newtonsoft.json),如何定义c#class(或类)以处理下面的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);

任何帮助将不胜感激。

尝试将您的 DataErrors成员定义为词典的ienumerables,而不是keyvaluepairs的ienumererables。(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;
};

然后,您可以使用SelectManyforeach循环读取数据:

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

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

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

再观察。

" 373" :"错误描述进入这里"

请不要将数字用作密钥/列名。

相关内容

  • 没有找到相关文章

最新更新