json 对象数组与对象的对象

v9tzhpje  于 2023-01-27  发布在  其他
关注(0)|答案(6)|浏览(205)

问题是要在以下符号之间进行权衡:

基于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为新条目创建的。我无法决定在后端使用哪种表示法(这最终也会影响UI)。
任何关于性能、可维护性或可伸缩性的想法/建议都将受到欢迎。

ldfqzlk8

ldfqzlk81#

这完全是一个主观的问题,可能还有很多其他的问题,但让我指出以下几点:

**基于JSON的方法:**如果我没有错的话,这将在服务器端使用Map实现。
**优点:**在JavaScript中可以直接使用users.id1users.id2,即不需要迭代
**缺点:**在客户端,不知何故,您需要id出现在JSON中,即要么硬编码它们,要么使用某种动态方法来告诉您哪个id出现在JSON中。
**基于阵列的方法:**如果我没有记错的话,这将在服务器端使用Array/List实现。
优势:

1.在客户端,你可以直接迭代数组,而不用预先担心哪个id出现在数组中,也就是说,没有硬编码。
1.正如**@JBNizet**所指出的,基于数组的方法将保持顺序。

**缺点:**如果你想获取单个id,那么你需要遍历数组。

通常我们不会在客户端发送太多的信息,所以基于数组的方法不会产生任何问题。如果你想要一个基于id的方法,**将一个数组转换成一个Map在两端(服务器和客户端)都是可能的。

ozxc1zmp

ozxc1zmp2#

在服务器端,数组存储为简单列表:ArrayList<Content>,而对象存储为Map:HashMap<String, Content>或大多数情况下作为Java对象。
为了在Java实体和JSON之间进行转换,您可以看看Jackson项目,它可以为您完成所有这些工作。
我不担心这两种变体之间的性能差异,更重要的是要有一个可理解的、语义化的API,因此您应该根据业务案例而不是性能来做出决策。
看一下你的例子,我认为Array是更好的方法,因为你想返回一个所有用户都相等的列表,发送两次id没有意义imho并且增加了必须传输的数据量。
此外,由于Arrays在Java中的存储和迭代要简单得多,因此它们也应该提供比Object更好的性能。

一些一般差异:

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

8i9zcol23#

除了上述所有技术差异之外,我认为Object和Array的目的和意义也存在根本差异。
1.对象的属性DESCRIBE/DEFINE对象
1.数组的元素不DESCRIBE/DEFINE数组,相反数组定义它的内容是什么。请注意-我不是在谈论技术方面。你可以有任何技术上的组合,但语义上每个都有自己的用途。

  • 例如一个保持器。每张卡都没有描述/定义持卡人。但是持卡人定义了它的用途--它只持有卡片。
  • 对象用于表示实体及其属性描述/定义实体。以卡片为例。卡片具有颜色、数字等属性,这些属性描述/定义卡片是什么。

对于上面的示例:
1.每个表示人的对象由属性idfirstNamelastName定义。
1.这些人的列表不可能是对象的对象,因为每个id并不描述对象的对象。所以
“用户”:[ {“标识符”:“标识符,“密钥2”:“值2,““密钥3”:“值3”},{“标识符”:“标识符,“密钥2”:“值2,““密钥3”:“值3”} ]
是比

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}

即使从技术上讲,你可以使用任何一种。我希望我能够以正确的方式传达(用语言表达)我的想法。

i7uaboj4

i7uaboj44#

您可以使用object[property]notation在JavaScript中访问或设置对象的属性。
在后端使用 * 基于数组 * 的方法,在前端将数组转换为Map(如您所称的 * 基于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中更新你的Map。
这样你的后端可以更快的响应,因为它不需要把列表转换成Map。你的前端会在列表上做一次O(n)的迭代来把它转换成Map。但是这和你每次搜索列表时要付出的O(n)相比是一个很小的代价。
如果您将主要在后端对数据执行get by id,请在后端使用 JSON Based(您可以使用LinkedHashMap来保持顺序)。

0pizxfdo

0pizxfdo5#

您想到的第一个“基于JSON”的表示法的一个很大的缺点是,有些框架在序列化(反序列化)。例如,DataContractSerializer(C# .NET)将期望定义字段id1id2(硬编码)在你的对象users的类中。我不确定这是否也适用于一些Java框架。也许你将要使用的框架可以将它反序列化为一个HashMap。
总之,我会发现数组符号在迭代等方面更直观。

nhhxz33t

nhhxz33t6#

这两种方法都有其优点和缺点,这取决于您所关注的内容。
数组方法很容易序列化,而且对“框架”更友好(你可以添加bean到一个列表中,序列化列表,这样就完成了)。这允许,例如,一个web容器返回响应,而不需要任何定制。这很可能被大多数框架开箱即用地支持。
另一方面,基于对象的方法更难生成(相对而言),但在已知密钥的情况下更容易查找。
因此,为了易于实现(由生产者),选择基于数组的方法。为了易于使用(由客户端使用),选择基于对象的方法。

相关问题