如何处理不同的反序列化JSON数据

本文关键字:反序列化 JSON 数据 何处理 处理 | 更新日期: 2023-09-27 18:21:31

问题背景:

我正在调用亚马逊产品广告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会是什么样子时,我无法继续创建不同的模型

如何处理不同的反序列化JSON数据

您可以使用JObject.Parse()在C#中使用动态类型。您只需要小心使用它,因为字段可能存在,也可能不存在。

dynamic foo = JObject.Parse(jsonText);
string bar = foo.Bar; // bar = "something"

在您给出的示例中,两个模型之间的唯一区别似乎是一个有SalePrice字段,而另一个没有。否则,它们是相同的。这种情况实际上很常见,处理起来也没什么大不了的。

默认情况下,JSON.Net将跳过JSON中没有相应字段的类成员,反之亦然。因此,您可以简单地定义一个具有您感兴趣的所有可能的产品字段的Product模型,并将其用于这两种情况。在体育用品的情况下,SalePrice将简单地为空。如果稍后在JSON中出现了一个您并不真正关心的额外字段,那么没问题——它将被忽略。

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变化更大,例如,如果一个字段有时是字符串,有时是字符串列表,那么您必须开始考虑其他方法。一种可能性是编写一个自定义的JsonConverter来处理差异。另一种可能性是反序列化为JObjectdynamic,而不是使用强类型类。