【问题标题】:How can I deserialize this JSON with JsonConvert?如何使用 JsonConvert 反序列化这个 JSON?
【发布时间】:2018-07-01 00:00:03
【问题描述】:

我有这个 JSON,但我不知道如何将它转换为 C# 中的对象列表。

这是 JSON:

{
  "2": {
    "sell_average": 239,
    "buy_average": 238,
    "overall_average": 240,
    "id": 2
  },
  "6": {
    "sell_average": 184434,
    "buy_average": 182151,
    "overall_average": 189000,
    "id": 6
  },
  "8": {
    "sell_average": 11201,
    "buy_average": 1723,
    "overall_average": 180,
    "id": 8
  }
}

以及我尝试使用的代码:

public class ItemSummaryModel
{
    public string Id { get; set; }
    public ItemSummary ItemSummary { get; set; }
}

public class ItemSummary
{
    public int Sell_Average { get; set; }
    public int Buy_Average { get; set; }
    public int Overall_Average { get; set; }
    public int Id { get; set; }
}

List<ItemSummaryModel> models =
    JsonConvert.DeserializeObject<List<ItemSummaryModel>>(jsonSummary);

无济于事。如何使用 Newtonsoft 的 JSON 库 (Json.Net) 将此 JSON 反序列化为这些对象的列表?

【问题讨论】:

  • 需要考虑的几件事:您正试图反序列化为一个列表,但您的 JSON 并不代表一个列表,它只是一个具有属性的复杂对象。其次,您的域对象属性名称与 JSON 属性名称不匹配,因此 C# 的大部分内容都需要使用在 JSON 中指定确切名称的属性进行修饰。最后,没有任何迹象表明“2”、“6”和“8”是“Id”,所以目前您的 JSON 结构并不等同于 C# 结构。

标签: c# json json.net


【解决方案1】:
public class ItemSummaryModel
{
    [JsonProperty(PropertyName = "2")]
    public ItemSummary Two { get; set; }
    [JsonProperty(PropertyName = "6")]
    public ItemSummary Six { get; set; }
    [JsonProperty(PropertyName = "8")]
    public ItemSummary Eight { get; set; }
}

var result = JsonConvert.DeserializeObject<ItemSummaryModel>(json);

这在技术上可以为您提供一个复杂的对象,但我不太喜欢它。拥有属性名称的数字将是一个问题。这对于单个复杂对象来说是 json 也很棘手。如果它是一个列表,您可以开始编写自己的 ContractResolver 来处理将数字属性名称映射到 id 字段并将实际对象映射到您想要的任何属性。

【讨论】:

  • 感谢您的帮助。唯一的问题是总共大约有 40,000 个对象。您认为在收到 JSON 后将其转换为列表会更容易吗?我无法控制输出的 JSON。
【解决方案2】:

你可以使用

var dict = JsonConvert.DeserializeObject<Dictionary<int, ItemSummary>>(json);
var items = dict.Values.ToList();  //if you want a List<ItemSummary>;

【讨论】:

  • 使用 Dictionary 因为字符串 id 例如 JSON 字符串中的“2”不能转换为 int
  • @VuDang 相信我,JSON.NET 比预期的要聪明。
  • 这……真的很优雅。我很喜欢。 JSON.NET 总是给人留下深刻印象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多