API设计:未公开的对象键与对象数组

时间:2019-01-15 17:02:59

标签: arrays json swagger key-value api-design

对于这个JSON API设计问题,我需要在API请求/响应主体中提供一组任意的键值对。键和值都是未知的。构造此内容的最佳方法是什么?

据我所知,有两种方法可以做到这一点:

1。未公开的对象键

{
    "fruit": "Apple",
    "sport": "Hockey",
    ...
    "keyN": "valueN"
}
  • PROS:非常干净,易于应用程序逻辑解析
  • 缺点:无法正确记录该对象-该对象的形状是无限任意的。

2。对象数组

[
    {
        "key": "fruit",
        "value": "Apple"
    },
    {
        "key": "sport",
        "value": "Hockey"
    },
    ...
    {
        "key": "keyN",
        "value": "valueN"
    }
]
  • PROS:易于记录和理解为具有已知结构的对象数组。
  • 缺点:应用程序逻辑将更加冗长。

构造此内容的最佳方法是什么?


注意:这是有关API文档而不是应用程序逻辑的问题。如上所述,我很清楚#1是代码中操纵的最佳解决方案。但是我还不清楚如何以始终正确解释的方式在API文档中对此进行记录

3 个答案:

答案 0 :(得分:2)

我非常非常强烈地推荐#1。 #2是一个变态。您的数据结构是一个字典。不要使用数组来实现字典,而要使用一半的功能。

考虑一下:您说您无法记录#1。那么您将如何记录#2?如果#1一定不能包含键“ strawberry”,那么您如何证明#2一定不能包含带有(键,值)对的字典,键对=“ key”,value =“ strawberry”?

如何检查#1或#2是否包含关键的“水果”,值是什么? #1是直接访问。 dict [“ fruit”]。在#2中,您需要遍历数组元素,检查它们是否都是字典,检查是否有一个带有输入键的条目:“ fruit”,检查它是否具有另一个条目“ value”。也许如果您通过代码行付款,您会这样做。

很有趣,三个完全不同的答案,每个答案都不好。显然,至少有两个拒绝投票者是愚蠢的。

答案 1 :(得分:0)

就文档而言,我个人认为#1和#2之间没有太大区别。如果字段未知,则空的地图/对象与空数组无关紧要。

我已经将其称为“杰森垃圾抽屉”。

我看到的一个附加功能是特定于“杰森垃圾抽屉”的命名地图/对象,例如:

{
  "fieldsThatDontChange" : "example",
  "attributes" :{
    "unknownfield" : "unknown"
  }
}

这真的是一种反模式。但是,这里的一个小好处是您可以告诉客户,属性部分是放置其未记录内容的位置。例如,甚至可以在属性部分上实施客户端特定的架构。

以下是有关JSON垃圾抽屉的更多信息,其中包含指向讨论该主题的youtube视频的一些链接:

http://apievangelist.com/2015/01/21/rest-api-design-bridging-what-we-have-to-the-future-by-organizing-the-json-junk-drawer/

答案 2 :(得分:-2)

更好的解决方案是:

2。对象数组

[
    {
        "key": "fruit",
        "value": "Apple"
    },
    {
        "key": "sport",
        "value": "Hockey"
    },
    ...
    {
        "key": "keyN",
        "value": "valueN"
    }
]

当涉及任意长度时,数组正是使用的正确模式。这比较冗长,但更容易理解。支持冗长。