【问题标题】:Is this json badly constructed?这个 json 构造不好吗?
【发布时间】:2014-04-15 19:10:14
【问题描述】:

以下 json 文本是调用 eBay 搜索 API 的结果。

问:Is this json 构造不好? (这在技术上是正确的 - 所以这不是我所指的)

我的意思是,注意每个值是如何在数组中的?而不仅仅是一个"key" : "value"

例如。

"ack": [
        "Success"
      ],

"version": [
        "1.12.0"
      ],

等等。

现在,在你回答“好吧,也许每个键都有多个结果值”之前。我很确定大多数不能。

(这个 json 模式真的让我的生活变成了一个皮塔饼。是的,很容易让每个 POCO 属性成为List<string>,但这就是重点!)

参考:Here's the office eBay API documention for this endpoint

【问题讨论】:

    标签: json api parsing schema jsonschema


    【解决方案1】:

    阅读文档后,我了解 eBay 的方法,但我发现它在客户端反序列化方面很差。例如,ack 属性的数组值的好处是该值还可以包含警告,例如:

    {
        "ack": [
            "Success",
            "Warning"
        ]
    }
    

    但是,字符串列表对于客户端处理并不理想(例如,在 C# 中,bool hasWarning = pocoList.Contains("Warning"); 并没有让我觉得完全万无一失)。我宁愿有这样的回应:

    {
        "ack": {
            "result": "Success",
            "warning": null
        }
    }
    

    然后使用我的反序列化 POCO,鉴于 warning 的值仍然是一个字符串,我可以这样写:

    [DataContract]
    public class Ack
    {
        [DataMember(Name="result")]
        public string Result { get; set; }
    
        [DataMember(Name="warning")]
        public string Warning { get; set; }
    
        [IgnoreDataMember]
        public bool HasWarning
        {
            get { return !string.IsNullOrEmpty(Warning); }
        }
    }
    

    这将允许我将之前的 LINQ 查询替换为 bool hasWarning = ack.HasWarning;

    肯定有一些地方完全不需要使用数组。文档将version 属性描述为“eBay 用于处理请求的发布版本”,因此我会将其作为单个字符串返回。该数组只有在它是 versions 属性时才有意义(例如,用于识别支持特定请求的所有后端版本)。

    我确实见过更糟糕的 JSON 响应,但有些地方 API 应该返回一个 JSON 对象或单个值。

    【讨论】:

      【解决方案2】:

      我通常使用这个工具来查看 JSON 是否构造良好:

      http://json.parser.online.fr/

      在你的情况下,是不正确的。您应该按键和值存储数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        相关资源
        最近更新 更多