【问题标题】:How to deserialize dynamically named JSON in c#?如何在 C# 中反序列化动态命名的 JSON?
【发布时间】:2021-06-22 16:59:07
【问题描述】:

我知道有很多类似的问题,我尝试在过去 12 小时内使用它,但没有结果。所以请给我任何建议如何解决我的问题。

我的 json 响应如下所示:

{
  "status": "OK",
  "products": {
    "dynamic10259668": {
      "ean": "4525348924",
      "sku": "9384573245",
      "name": "name1",
    },
    "dynamic10630436": {
      "ean": "983623203943",
      "sku": "9312763245",
      "name": "name2"
    },
    "dynamic10634396": {
     "ean": "1002904820",
     "sku": "9384763245",
     "name": "name3"
    },
    "dynamic10634398": {
      "ean": "3400901100",
      "sku": "9312763245",
      "name": "name4"
    },
    "dynamic10634399": {
      "ean": "8100103701",
      "sku": "454763245",
      "name": "name5"
    },
    "dynamic10634766": {
      "ean": "5600904820",
      "sku": "9384763245",
      "name": "name6"
    }
  }
}

和模型:

public class ProductsList

{
    public string status { get; set; }
    public ListProducts products { get; set; }
}

public class ListProducts
{
    public ListProduct product { get; set; }
}

public class ListProduct
{
    public string ean { get; set; }
    public string sku { get; set; }
    public string name { get; set; }
}

现在我需要例如目录 但不知道如何获取产品价值。我试过这段代码:

ProductsList productsList = JsonConvert.DeserializeObject<ProductsList>(response.Content);

foreach (ListProduct singleProduct in productsList.products.product)
{
    Console.WriteLine(singleProduct.name);
}

我最常见的错误是:

System.NullReferenceException:对象引用未设置为对象的实例。

【问题讨论】:

标签: c# json serialization


【解决方案1】:

您需要使用Dictionary&lt;string, ListProduct&gt;。我相信这会如你所愿。

我保留了您的 ListProduct 课程,但将 ProductsList 修改为如下所示:

public class ProductsList
{
    public string status { get; set; }
    public Dictionary<string, ListProduct> products { get; set; }
}

当我这样做时,这段代码会正确反序列化您的 JSON:

var result = JsonConvert.DeserializeObject<ProductsList>(theJson);

您可以使用以下方式获取dynamic10259668 的数据:

if (result.products.TryGetValue("dynamic10259668", out var item))
{
    Debug.WriteLine($"Name: {item.name}, Ean: {item.ean}, Sku: {item.sku}");
}

【讨论】:

    【解决方案2】:

    您似乎希望有一个产品名称字典来查找。如果这就是你所需要的,那么下面的代码就可以工作:

    dynamic d = JObject.Parse(response.Content);
    var productDictionary = new Dictionary<string, string>();
    foreach (var product in d.products)
    {
       productDictionary[product.Name] = (string)product.Value.ean;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2021-07-26
      • 2021-01-13
      • 1970-01-01
      • 2021-09-14
      • 2013-02-20
      • 2015-12-05
      相关资源
      最近更新 更多