问题背景:
我正在调用亚马逊产品广告API,并从他们的服务中接收JSON格式的产品列表。
问题:
遗憾的是,JSON响应因提供给API的参数而异。例如:搜索体育用品'对“手表”的反应略有不同。
以下是一个非常简单的差异示例:
从API收到的体育用品JSON:
{
"Item": {
"ID": "145",
"Title": "Football",
"ImageUrl": "http://amazon.com/football.jpg",
"Shipping": "UK",
"ListPrice": "7.99"
}
}
观看从API收到的JSON:
{
"Item": {
"ID": "567",
"Title": "RolexWatch",
"ImageUrl": "http://amazon.com/RolexWatch.jpg",
"Shipping": "UK",
"ListPrice": "£7000.00",
"SalePrice": "£6500.00" <------------- extra item in Watches JSON
}
}
我目前正在使用NewtonSoft将两个响应反序列化为两个不同的C#模型,即:
public class SportingGoods
{
public string ID {set;get;}
public string Title {set;get;}
public string ImagesUrl {set;get;}
public string Shipping{set;get;}
public string ListPrice{set;get;}
}
public class Watches
{
public string ID {set;get;}
public string Title {set;get;}
public string ImagesUrl {set;get;}
public string Shipping{set;get;}
public string ListPrice{set;get;}
public string SalePrice{set;get;}
}
我发现Amazon API的JSON响应还有其他变化。 当JSON数据变化如此之大时,如何正确处理这种去激活?当我不能100%确定JSON的样子时,我不能继续创建不同的模型。
答案 0 :(得分:3)
您可以使用JObject.Parse()
在C#中使用动态类型您只需要小心使用它,因为字段可能存在,也可能不存在。
dynamic foo = JObject.Parse(jsonText);
string bar = foo.Bar; // bar = "something"
答案 1 :(得分:1)
在您给出的示例中,看起来两个模型之间的唯一区别是一个具有SalePrice
字段而另一个不具有Product
字段。否则,它们是相同的。这种情况实际上很常见,并不是一件大事。
默认情况下,JSON.Net将跳过JSON中没有相应字段的类成员,反之亦然。因此,您只需定义一个SalePrice
模型,该模型包含您感兴趣的所有可能的产品字段,并将其用于这两种情况。对于体育用品,public class Product
{
public string ID { get; set; }
public string Title { get; set; }
public string ImagesUrl { get; set; }
public string Shipping { get; set; }
public string ListPrice { get; set; }
public string SalePrice { get; set; }
}
将仅为空。如果有一个额外的字段在JSON中出现,你真的不关心,没问题 - 它将被忽略。
dynamic
现在,如果您的JSON变化更大,例如,如果字段有时是字符串,有时是字符串列表,那么您必须开始查看其他方法。一种可能性是编写自定义JsonConverter
来处理差异。另一种可能性是反序列化为JObject
或$ is not a function
,而不是使用强类型类。