问题在于决定以下符号之间的权衡:
基于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为新条目创建。我无法决定我应该在后端使用哪种表示法(最终也会影响用户界面)。
有关性能,可维护性或可扩展性的任何想法/建议都表示赞赏。
答案 0 :(得分:19)
这是一个基于意见的总问题。可能还有很多其他问题,但我可以在下面指出。
基于JSON的方法:
如果我没有错,那么这将在服务器端使用Map
实现。
优势:在JavaScript中,您可以直接使用users.id1,users.id2,即无需迭代
缺点:在客户端,您需要一些如何使用JSON中的ID,即硬编码或使用一些动态方法来告诉您JSON中存在哪个ID。< / p>
基于数组的方法:如果我没有错,那么这将在服务器端使用Array
/ List
实现。
<强>优势:强>
缺点:如果您想获取单个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)
除了上述所有技术差异外,我认为对象和数组的目的和含义也存在根本差异。
数组的元素不描述/定义,相反,数组定义了其内容。 请注意-我不是在谈论技术方面。从技术上讲,您可以有任何组合,但从语义上讲,每种组合都有其用途。
例如持卡人。每张卡都会不描述/定义持卡人。但是持卡人确实定义了仅持有卡的目的/
对象用于表示实体,其属性 DESCRIBE / DEFINE 。以卡的相同示例为例。卡片具有颜色,编号等属性,该属性 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"
}
}
即使从技术上讲您也可以使用。 我希望我能够以正确的方式传达(说出话来)我的想法。