问题是要在以下符号之间进行权衡:
基于JSON:
"users": {
"id1": {
"id": "id1",
"firstname": "firstname1",
"lastname": "lastname1"
},
"id2": {
"id": "id2",
"firstaame": "firstname2",
"lastname": "lastname2"
}
}
基于阵列:
users: [
{
"id": "id",
"key2": "value2",
"key3": "value3"
},
{
"id": "id",
"key2": "value2",
"key3": "value3"
}
]
关于同一问题的this帖子,我决定(在前端)使用JSON对象表示法而不是对象数组,因为它适合我的要求,提供更好的性能,并导致浏览器中的代码更少。
但问题是列表本身不是静态的。我的意思是列表是从DB(NoSQL)中获取/存储并通过服务器上的Java API为新条目创建的。我无法决定在后端使用哪种表示法(这最终也会影响UI)。
任何关于性能、可维护性或可伸缩性的想法/建议都将受到欢迎。
6条答案
按热度按时间ldfqzlk81#
这完全是一个主观的问题,可能还有很多其他的问题,但让我指出以下几点:
**基于JSON的方法:**如果我没有错的话,这将在服务器端使用
Map
实现。**优点:**在JavaScript中可以直接使用
users.id1
、users.id2
,即不需要迭代**缺点:**在客户端,不知何故,您需要id出现在JSON中,即要么硬编码它们,要么使用某种动态方法来告诉您哪个id出现在JSON中。
**基于阵列的方法:**如果我没有记错的话,这将在服务器端使用
Array
/List
实现。优势:
1.在客户端,你可以直接迭代数组,而不用预先担心哪个id出现在数组中,也就是说,没有硬编码。
1.正如**@JBNizet**所指出的,基于数组的方法将保持顺序。
**缺点:**如果你想获取单个id,那么你需要遍历数组。
通常我们不会在客户端发送太多的信息,所以基于数组的方法不会产生任何问题。如果你想要一个基于id的方法,**将一个数组转换成一个Map在两端(服务器和客户端)都是可能的。
ozxc1zmp2#
在服务器端,数组存储为简单列表:
ArrayList<Content>
,而对象存储为Map:HashMap<String, Content>
或大多数情况下作为Java对象。为了在Java实体和JSON之间进行转换,您可以看看Jackson项目,它可以为您完成所有这些工作。
我不担心这两种变体之间的性能差异,更重要的是要有一个可理解的、语义化的API,因此您应该根据业务案例而不是性能来做出决策。
看一下你的例子,我认为
Array
是更好的方法,因为你想返回一个所有用户都相等的列表,发送两次id没有意义imho并且增加了必须传输的数据量。此外,由于
Arrays
在Java中的存储和迭代要简单得多,因此它们也应该提供比Object更好的性能。一些一般差异:
8i9zcol23#
除了上述所有技术差异之外,我认为Object和Array的目的和意义也存在根本差异。
1.对象的属性DESCRIBE/DEFINE对象
1.数组的元素不DESCRIBE/DEFINE数组,相反数组定义它的内容是什么。请注意-我不是在谈论技术方面。你可以有任何技术上的组合,但语义上每个都有自己的用途。
对于上面的示例:
1.每个表示人的对象由属性
id
、firstName
和lastName
定义。1.这些人的列表不可能是对象的对象,因为每个id并不描述对象的对象。所以
“用户”:[ {“标识符”:“标识符,“密钥2”:“值2,““密钥3”:“值3”},{“标识符”:“标识符,“密钥2”:“值2,““密钥3”:“值3”} ]
是比
即使从技术上讲,你可以使用任何一种。我希望我能够以正确的方式传达(用语言表达)我的想法。
i7uaboj44#
您可以使用
object[property]
notation在JavaScript中访问或设置对象的属性。在后端使用 * 基于数组 * 的方法,在前端将数组转换为Map(如您所称的 * 基于JSON *)。
如果你的列表发生了变化,你可以从后端获得新的列表,并在UI中更新你的Map。
这样你的后端可以更快的响应,因为它不需要把列表转换成Map。你的前端会在列表上做一次O(n)的迭代来把它转换成Map。但是这和你每次搜索列表时要付出的O(n)相比是一个很小的代价。
如果您将主要在后端对数据执行get by id,请在后端使用 JSON Based(您可以使用
LinkedHashMap
来保持顺序)。0pizxfdo5#
您想到的第一个“基于JSON”的表示法的一个很大的缺点是,有些框架在序列化(反序列化)。例如,DataContractSerializer(C# .NET)将期望定义字段
id1
和id2
(硬编码)在你的对象users
的类中。我不确定这是否也适用于一些Java框架。也许你将要使用的框架可以将它反序列化为一个HashMap。总之,我会发现数组符号在迭代等方面更直观。
nhhxz33t6#
这两种方法都有其优点和缺点,这取决于您所关注的内容。
数组方法很容易序列化,而且对“框架”更友好(你可以添加bean到一个列表中,序列化列表,这样就完成了)。这允许,例如,一个web容器返回响应,而不需要任何定制。这很可能被大多数框架开箱即用地支持。
另一方面,基于对象的方法更难生成(相对而言),但在已知密钥的情况下更容易查找。
因此,为了易于实现(由生产者),选择基于数组的方法。为了易于使用(由客户端使用),选择基于对象的方法。