java 数组对象_java-对象数组与对象对象

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值