对象数组与对象对象

时间:2015-07-17 06:17:01

标签: java arrays json performance maintainability

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

基于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为新条目创建。我无法决定我应该在后端使用哪种表示法(最终也会影响用户界面)。

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

6 个答案:

答案 0 :(得分:19)

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

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

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

缺点:在客户端,您需要一些如何使用JSON中的ID,即硬编码或使用一些动态方法来告诉您JSON中存在哪个ID。< / p>

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

<强>优势:

  1. 在客户端,您可以直接遍历数组,而不是 事先担心内部存在哪个内容,即没有困难 编码
  2. 正如 @JBNizet 所指出的,基于数组的方法将维持订单。
  3. 缺点:如果您想获取单个ID,则需要遍历数组。

    通常我们不会在客户端发送太多信息,因此基于数组的方法不会产生任何问题。如果你想要基于身份的方法,可以在一边(服务器和客户端)转换数组到地图。

答案 1 :(得分:6)

在服务器端,数组存储为简单列表:.resume img.pdf { position: relative; top:500px; } ,而对象存储为地图:ArrayList<Content>或大部分存储为Java对象。

为了将Java实体与JSON进行转换,您可以查看为您完成所有这些工作的Jackson项目。

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

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

此外,由于Array更容易在Java中存储和迭代,因此它们还应提供比Objects更好的性能。

一些一般性差异:

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

答案 2 :(得分:1)

您想到的第一个“基于JSON”符号的一个主要缺点是某些框架会出现(反)序列化问题。例如,DataContractSerializer(C#.NET)将期望在对象id1的类中定义({1}}和id2字段。我不确定这是否也适用于某些Java框架。也许您使用的框架可以将其反序列化为HashMap。

总而言之,我发现在迭代等方面,数组符号更直观。

答案 3 :(得分:0)

您可以使用object[property] notation在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的(您可以使用LinkedHashMap来保留订单)。

答案 4 :(得分:0)

这两种方法各有利弊,取决于你所看到的是什么。

阵列方法很容易序列化,并且更加“框架”友好(您可以将bean添加到列表中并序列化列表,您就完成了)。例如,这允许Web容器返回响应而无需任何自定义。大多数框架都可能支持这种情况。

另一方面,基于对象的方法更难以生成(相对而言),但鉴于密钥已知,它更容易查找。

因此,为了便于实现(由制作人),请选择基于数组的方法。为了便于使用(由客户使用),请选择基于对象的方法。

答案 5 :(得分:-1)

除了上述所有技术差异外,我认为对象和数组的目的和含义也存在根本差异。

  1. 对象的属性 DESCRIBE / DEFINE ,而对象
  2. 数组的元素不描述/定义,相反,数组定义了其内容。 请注意-我不是在谈论技术方面。从技术上讲,您可以有任何组合,但从语义上讲,每种组合都有其用途。

    • 例如持卡人。每张卡都会不描述/定义持卡人。但是持卡人确实定义了仅持有卡的目的/

    • 对象用于表示实体,其属性 DESCRIBE / DEFINE 。以卡的相同示例为例。卡片具有颜色,编号等属性,该属性 DESCRIBE / DEFINE 是什么。

对于上述示例:

  1. 代表人物的每个对象都由属性 id,firstName和lastName定义。

  2. 这些人员的列表不能成为对象的对象,因为每个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"
    }
}

即使从技术上讲您也可以使用。 我希望我能够以正确的方式传达(说出话来)我的想法。

相关问题