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