java-对象数组与对象对象
问题在于确定以下符号之间的权衡:
基于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"
}
]
关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。
但是问题在于列表本身不是静态的。 我的意思是表示正在生成列表,即从DB(NoSQL)获取/存储列表,并通过服务器上的Java API为新条目创建列表。 我无法决定在后端应使用哪种表示法(最终也会影响UI)。
任何有关性能,可维护性或可伸缩性的想法/建议均应受到赞赏。
6个解决方案
19 votes
这是一个完全基于意见的问题。 可能还有很多其他要点,但我可以指出如下。
基于JSON的方法:如果我没有记错,那么将在服务器端使用Array来实现。
优点:在JavaScript中,您可以直接使用users.id1,users.id2,即无需迭代
缺点:在客户端,您将需要一些如何使用JSON中存在的ID的方法,即对它进行硬编码或使用某种动态方法来告诉您JSON中存在哪些ID。
基于数组的方法:如果我没有记错的话,将在服务器端使用Array/List来实现。
优点:
在客户端,您可以直接遍历数组,而无需事先担心里面有哪个ID,即不难编码。
正如@JBNizet指出的那样,基于数组的方法将保持顺序。
缺点:如果要获取单个id,则需要遍历数组。
通常,我们不会在客户端发送太多信息,因此基于数组的方法不会造成任何问题。 如果希望使用基于id的方法,则可以在服务器端和服务器端将数组转换为map。
Naman Gala answered 2020-02-11T12:35:51Z
6 votes
在服务器端,数组存储为简单列表:Arrays,而对象存储为映射:HashMap或大多数存储为Java对象。
为了将Java实体与JSON相互转换,您可以看一下Jackson项目,该项目为您完成了所有工作。
我不会担心这两个变体之间的性能差异。 拥有一个易于理解的语义API更为重要,因此,您应该基于业务案例而不是性能。
查看您的示例,我认为Arrays是更好的方法,因为您想返回所有相等的用户列表。 两次发送id毫无意义,并增加了必须传输的数据量。
此外,由于Arrays在Java中更易于存储和迭代,因此它们还应提供比Objects更好的性能。
一些一般差异:
数组保留顺序
数组可以包含重复的条目
对象通常具有更大的存储/网络开销
数组的迭代速度更快(在服务器端)
maja answered 2020-02-11T12:36:52Z
1 votes
想到的第一个“基于JSON”表示法的一个很大的缺点是某些框架会对此(反)序列化产生问题。 例如,DataContractSerializer(C#.NET)期望在您的对象类users中定义(硬编码)字段id1和id2。我不确定这是否也适用于某些Java框架。 也许您将使用的框架可以将其反序列化为HashMap。
总的来说,在迭代等方面,我发现使用数组表示法更加直观。
Sebastian answered 2020-02-11T12:37:18Z
0 votes
您可以使用LinkedHashMap表示法来访问或设置JavaScript对象中的属性。
在后端使用基于数组的方法,然后在前端将数组转换为映射(指的是基于JSON的映射)。
var list = [{id: "id1", value: "One"}, {id: "id2", value: "Two"}]
var map = {};
list.forEach(function (item) { map[item.id] = item });
map.get("id1")
如果列表更改,则可以从后端获取新列表并在UI中更新地图。
这样,后端无需将列表转换为地图,因此响应速度更快。 您的前端将对列表进行一次O(n)迭代,以将其转换为地图。 但是,与您每次在列表上搜索时要支付的O(n)相比,这是一个很小的价格。
如果您将主要在后端通过数据进行id获取,请在后端本身使用JSON Based(可以使用LinkedHashMap保留顺序)。
Foxx answered 2020-02-11T12:37:57Z
0 votes
两种方法各有优缺点,并取决于您要查看的内容。
数组方法易于序列化,并且对“框架”更为友好(您可以将bean添加到列表中并序列化列表,然后完成)。 例如,这允许Web容器返回响应而无需任何自定义。 大多数框架都可能直接支持此功能。
另一方面,基于对象的方法更难生成(相对而言),但是在已知密钥的情况下更易于查找。
因此,为了便于实施(按生产者),请选择基于数组的方法。 为了易于使用(客户端消耗),请使用基于对象的方法。
Ravindra HV answered 2020-02-11T12:38:32Z
0 votes
除了上述所有技术差异外,我认为对象和数组的目的和含义也存在根本差异。
对象的属性DESCRIBE / DEFINE对象,而
数组的元素不能描述/定义数组,相反,数组定义了其内容。请注意-我不是在谈论技术方面。 从技术上讲,您可以有任何组合,但从语义上讲,每种组合都有其用途。
例如持卡人。 每张卡都不会描述/定义持卡人。 但持卡人确实定义了仅持有卡/
对象用于表示实体,其属性描述/定义实体。 以卡的相同示例为例。 卡片具有颜色,编号等属性,它们描述/定义卡片的含义。
对于上面的示例:
每个代表一个人的对象都由属性id,firstName和lastName定义。
这些人员的列表不能是对象的对象,因为每个id都没有描述对象的对象。 所以
“用户”:[ { “ id”:“ id”, “ key2”:“ value2”, “ key3”:“ value3” }, { “ id”:“ id”, “ key2”:“ value2”, “ key3”:“ value3” }]
比一个更好的表示
"users": {
"id1": {
"id": "id1",
"firstname": "firstname1",
"lastname": "lastname1"
},
"id2": {
"id": "id2",
"firstaame": "firstname2",
"lastname": "lastname2"
}
}
即使从技术上讲您也可以使用。我希望我能够以正确的方式传达(说出话)我的想法。
wallop answered 2020-02-11T12:39:37Z