对象数组与对象对象

me_*_*jay 49 java arrays maintainability performance json

问题是决定以下符号之间的权衡:

基于JSON:

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}
Run Code Online (Sandbox Code Playgroud)

基于数组:

users: [
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    },
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    }
]
Run Code Online (Sandbox Code Playgroud)

关于同一问题的这篇文章,我决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,并且在浏览器中具有更好的性能和更少的代码.

但问题是列表本身并不是静态的.我的意思是生成列表,即从DB(NoSQL)获取/存储,并通过服务器上的Java API为新条目创建.我无法决定我应该在后端使用哪种表示法(最终也会影响用户界面).

任何关于性能,可维护性或可扩展性的想法/建议都表示赞赏.

Nam*_*ala 19

这是一个基于意见的总问题.可能还有很多其他问题,但我可以在下面指出.

基于JSON的方法: 如果我没有错,那么这将Map在服务器端实现.

优点:在JavaScript中,您可以直接使用users.id1,users.id2,即无需迭代

缺点:在客户端,有些人会如何要求你的JSON中存在的id,即硬编码或者使用一些动态方法来告诉你JSON中存在哪个id.


基于数组的方法:如果我没有错,那么这将使用Array/ List在服务器端实现.

优点:

  1. 在客户端,您可以直接遍历数组,而无需事先担心其中存在哪个ID,即没有硬编码.
  2. 正如@JBNizet指出的那样,基于数组的方法将维持秩序.

缺点:如果要获取单个ID,则需要遍历数组.

通常我们不会在客户端发送太多信息,因此基于数组的方法不会产生任何问题.和转化数组地图有可能在两侧(服务器和客户端),如果你想基于ID的方法.

  • 硬代码部分并不是真正的问题.您还可以迭代一个对象`for(key in obj)`并且可以使键值可配置.但我怀疑这甚至是必要的. (2认同)

maj*_*aja 6

在服务器端,数组存储为简单列表:ArrayList<Content>,而对象存储为映射:HashMap<String, Content>或者,主要存储为Java对象.

为了将Java实体转换为JSON,您可以查看杰克逊项目,它可以为您完成所有这些工作.

我不担心这两个变体之间的性能差异.拥有一个可理解的语义API更为重要,因此您应该根据业务案例而不是绩效来确定您的理念.

看看你的例子,我认为一个Array更好的方法,因为你想返回一个完全相同的用户列表.发送id两次毫无意义,并增加了必须传输的数据量.

此外,由于Arrays在Java中存储和迭代更加简单,因此它们还应提供比Objects更好的性能.

一些一般差异:

  • 数组保留了顺序
  • 数组可以包含重复的条目
  • 对象通常具有更大的存储/网络开销
  • 数组的迭代速度更快(在服务器端)