对于这个JSON API设计问题,我需要在API请求/响应主体中提供一组任意的键值对。键和值都是未知的。构造此内容的最佳方法是什么?
据我所知,有两种方法可以做到这一点:
{
"fruit": "Apple",
"sport": "Hockey",
...
"keyN": "valueN"
}
[
{
"key": "fruit",
"value": "Apple"
},
{
"key": "sport",
"value": "Hockey"
},
...
{
"key": "keyN",
"value": "valueN"
}
]
构造此内容的最佳方法是什么?
注意:这是有关API文档而不是应用程序逻辑的问题。如上所述,我很清楚#1是代码中操纵的最佳解决方案。但是我还不清楚如何以始终正确解释的方式在API文档中对此进行记录
答案 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视频的一些链接:
答案 2 :(得分:-2)
更好的解决方案是:
[
{
"key": "fruit",
"value": "Apple"
},
{
"key": "sport",
"value": "Hockey"
},
...
{
"key": "keyN",
"value": "valueN"
}
]
当涉及任意长度时,数组正是使用的正确模式。这比较冗长,但更容易理解。支持冗长。