反序列化动态JSON对象

3
我正在使用第三方API,我收到的Json响应如下。 通常,可以使用类似于以下代码的内容:
Newtonsoft.Json.JsonConvert.DeserializeObject<MyModel>(response);

我可以轻松创建 .Net 模型。然而,我正苦苦思考如何构建下面的内容。我尝试了键值对、字符串、修改实际的 Json ,但似乎无法获得任何帮助。
我缺少什么?
{
  "1": [
    {
      "qty": 1,
      "discount": "flat",
      "price": 71.68
    }
  ],
  "2": [
    {
      "qty": 1,
      "discount": "flat",
      "price": 62.75
    }
  ],
  "3": [
    {
      "qty": 1,
      "discount": "flat",
      "price": 77.28
    }
  ],
  "4": [
    {
      "qty": 1,
      "discount": "flat",
      "price": 82.88
    }
  ],
  "5": [
    {
      "qty": 1,
      "discount": "flat",
      "price": 67.84
    }
  ]
}

现在,让我困惑的是,这些数字(1、2、3、4、5)是标识符,因此不会保持不变,并且每次收到响应时都可能会更改。

尝试将JSON粘贴到此工具中,以帮助您构建模式类。 https://json2csharp.com/ - Kieran Devlin
2
Dictionary<string, MyClass> 怎么样?(其中 MyClass 包含 qty、discount 和 price)(或者可能是 Dictionary<string, MyClass[]>,因为尽管每个索引只有一个对象,但它似乎是一个数组)。 - Neil
2
@KieranDevlin 它生成了垃圾(class1,class2,class3等) - Neil
@Neil,Dictionary 与 KeyValuePair<string,MyClass> 实际上是相同的,并返回相同的错误。问题在于,这种格式中的标识符变成了属性名称而不是值。 - scully
2
MyModel 长什么样子?看起来,Dictionary<string, MyModel[]>(值应该是一个数组)会对你有所帮助。 - Pavel Anikhouski
显示剩余4条评论
2个回答

5

我认为Newtonsoft可以帮你实现这个功能。

string json = @"{
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}";

var jsonReturn = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>( json );
Console.WriteLine( jsonReturn.Email );

基于此链接: https://www.newtonsoft.com/json/help/html/DeserializeObject.htm 这是最基本的解释。使用foreach遍历节点。

1

使用 @Liam 的建议,我想出了这个可行的解决方案。

public class MyObject
{
        public int id { get; set; }
        public int qty { get; set; }
        public string discount { get; set; }
        public decimal price { get; set; }
}

然后在获取JSON响应之后...
        var jsonObj = JsonConvert.DeserializeObject<JObject>(response);

        List<MyObject> myObjects = new List<MyObject>();

        foreach (var item in jsonObj.AsJEnumerable())
        {
                var csp = JsonConvert.DeserializeObject<List<MyObject>>(item.First.ToString());

                csp.ForEach(a => { a.product_id = Convert.ToInt32(item.Path); });
                    
                myObjects.AddRange(csp);
         }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接