【问题标题】:Deserialize JSON object structure with ids as keys [duplicate]反序列化以id为键的JSON对象结构[重复]
【发布时间】:2015-09-13 17:48:02
【问题描述】:

我有这个由第三方网络服务生成的 JSON

{
  "user_data": {
    "123456789": {
      "transactions_id": 123456789,
      "transaction_date": "2015-07-08T18:31:28+01:00",
      "reason_type": "REWARD",
      "category": "categoryFoo",
      "title": "titleFoo",
      "description": "",
      "reward_quantity": 5,
      "reward_name": " foo"
    },
    "1234567891": {
      "transactions_id": 1234567891,
      "transaction_date": "2015-07-08T18:33:06+01:00",
      "reason_type": "REWARD",
      "category": "categoryFoo",
      "title": "titleFoo",
      "description": "",
      "reward_quantity": 5,
      "reward_name": " foo"
    },
    "1234567892": {
      "transactions_id": 1234567892,
      "transaction_date": "2015-07-08T18:35:00+01:00",
      "reason_type": "REWARD",
      "category": "categoryFoo",
      "title": "titleFoo",
      "description": "",
      "reward_quantity": 5,
      "issuers_name": " foo"
    }
  }
}

事务量会随着每个请求而变化,因此一次可能有 3 次这样的请求,然后下一次可能有 10 次。为了处理不同数量的交易,我知道您需要使用与此 public List<User> users { get; set; } 类似的列表,而用户与此类似

public class User
{
    public int transactions_id { get; set; }
    public string transaction_date { get; set; }
    public string reason_type { get; set; }
    public string category { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public int reward_quantity { get; set; }
    public string reward_name { get; set; }
}

但我确实认为这会起作用,因为 JSON 的结构很奇怪,其中每个“事务”都以 ID 作为其名称。抱歉,我不确定术语是否正确,但我认为您应该能够理解要点。

【问题讨论】:

  • 请不要在问题标题中重复标签。
  • 使用public Dictionary<long, User> user_data { get; set; }。或者 public Dictionary<string, User> user_data { get; set; } 如果 ID 并不总是数字。
  • Dictionary<string, User>?

标签: c# json list json.net deserialization


【解决方案1】:

这不是 JSON 中特别不寻常的结构。那应该被反序列化为Dictionary<string, User>:

public class Root
{
    [JsonProperty("user_data")]
    public Dictionary<string, User> Users { get; set; }
}

然后照常使用JsonConvert.DeserializeObject&lt;Root&gt;

请注意我是如何使用 JsonProperty 来指定名称在 JSON 中的表示方式,同时保留惯用的 .NET 属性名称 - 我建议您也可以在 User 类中这样做。

【讨论】:

    【解决方案2】:
    public class UserData
    {
        [JsonProperty("user_data")]
        public Dictionary<string, User> Users { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 2019-06-20
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2019-02-19
      相关资源
      最近更新 更多