如何在 C# 中反序列化动态命名的 JSON?

How to deserialize dynamically named JSON in c#?

我知道有很多类似的问题,我在过去的 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; }
}

现在我需要例如目录<"dynamic10259668", "9384573245"> 但不知道如何访问产品值。我试过这个代码:

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

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

我最常犯的错误是:

System.NullReferenceException: Object reference not set to an instance of an object.

您需要使用 Dictionary<string, ListProduct>。我相信那会如你所愿。

我保留了您的 ListProduct class,但将 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}");
}

看来您希望查找产品名称字典。如果这就是您所需要的,那么以下代码将起作用:

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