首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理反序列化变化的JSON数据?

如何处理反序列化变化的JSON数据?
EN

Stack Overflow用户
提问于 2015-11-11 23:31:18
回答 2查看 144关注 0票数 1

问题背景:

我正在调用Amazon产品广告API,并从他们的服务中收到一份JSON格式的产品列表。

问题:

遗憾的是,JSON响应会根据提供给API的参数而变化。例如:搜索“体育用品”会给出与“手表”略有不同的反应。

以下是一个非常简单的差异示例:

从API收到的体育用品JSON:

代码语言:javascript
运行
复制
{
    "Item": {
        "ID": "145",
        "Title": "Football",
        "ImageUrl": "http://amazon.com/football.jpg",
        "Shipping": "UK",
        "ListPrice": "7.99"
    }
}

监视从API接收到的JSON:

代码语言:javascript
运行
复制
{
    "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#模型,即:

代码语言:javascript
运行
复制
 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的JSON响应还有其他的变化。当数据变化如此之大时,我该如何正确地处理这个去珠光体呢?当我不能100%确定JSON会是什么样子的时候,我不能一直创建不同的模型。

EN

回答 2

Stack Overflow用户

发布于 2015-11-11 23:41:01

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

代码语言:javascript
运行
复制
dynamic foo = JObject.Parse(jsonText);
string bar = foo.Bar; // bar = "something"
票数 4
EN

Stack Overflow用户

发布于 2015-11-12 00:11:09

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

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

代码语言:javascript
运行
复制
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,而不是使用强类型的类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33661834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档