对象数组与对象数组

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

基于 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)。

任何关于性能,可维护性或可扩展性的想法/建议都值得赞赏。


答案 1

这是一个完全基于意见的问题。可能还有许多其他要点,但我可以指出如下。

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

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

缺点:在客户端,您将需要JSON中存在的ID,即对其进行硬编码或使用一些动态方法,这将告诉您JSON中存在哪个ID。


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

优势:

  1. 在客户端,您可以直接循环访问数组,而无需提前担心其中存在哪个ID,即没有硬编码。
  2. 正如@JBNizet所指出的那样,基于数组的方法将保持顺序。

缺点:如果要获取单个 ID,则需要循环访问数组。

通常,我们不会在客户端发送太多信息,因此基于数组的方法不会产生任何问题。并且,如果您想要基于 id 的方法,则可以在两端(服务器和客户端)将数组转换为映射


答案 2

在服务器端,数组存储为简单的 List:,而对象存储为映射:或者大多数情况下,存储为 Java 对象。ArrayList<Content>HashMap<String, Content>

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

我不会担心这两个变体之间的任何性能差异。拥有一个可理解的语义 API 更为重要,因此您应该根据业务案例而不是性能来做出决定。

看看你的例子,我认为一个是更好的方法,因为你想返回一个用户列表,这些用户都是平等的。恕我直言,发送ID两次是没有意义的,并且会增加必须传输的数据量。Array

此外,由于它们在Java中存储和迭代要简单得多,因此它们也应该提供比对象更好的性能。Arrays

一些一般区别:

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