这个json构造得很糟糕吗?

时间:2014-03-11 22:37:18

标签: json api parsing schema jsonschema

以下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

2 个答案:

答案 0 :(得分: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); }
    }
}

这样我就可以用bool hasWarning = ack.HasWarning;替换以前的LINQ查询。

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

我肯定看到了更糟糕的JSON响应,但有些地方理想情况下API应该返回JSON对象或单个值。

答案 1 :(得分:0)

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

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

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