【发布时间】:2021-04-13 07:08:55
【问题描述】:
我有以下来自网络请求的 JSON 结构,我需要对其进行解析并保留键的顺序。
const json = `{
"2": "first",
"1": "second"
}`;
但是根据规范,JSON.parse() 不保证键的顺序,并且在几乎所有实现中,这意味着键按字母或数字顺序排列,从而产生以下对象。
{
1: "second"
2: "first"
}
为了保留键的顺序,我想直接将 JSON 字符串解析成 Map,因为 Map 会保留键的顺序。但是到目前为止我发现的所有内容都建议使用以下代码,这显然会首先将其解析为一个对象(并破坏键的顺序),然后将该对象转换为 Map。
new Map(Object.entries(JSON.parse(json)));
所以我的问题是,是否有办法直接将 JSON 解析为映射并保留键的顺序。
第二个问题是这是否也仅适用于子对象,例如这样
const nestedJson = '{
"I_dont_care_about_the_order": "foobar",
"Preserve_the_order_in_this_object": {
"2": "first",
"1": "second"
}
}';
【问题讨论】:
-
您的“JSON”不是 JSON。它的语法无效,您想要的输出对象也是如此
-
为什么要关心订单?如果订单相关,发件人应该发送一个数组。
-
抱歉,JSON 不正确,我已修复。我关心订单,因为该对象中的条目来自网络请求,并且在服务器上进行排序。服务器使用对象 ID(整数)作为返回对象中的键,但在 JSON 字符串中以正确的顺序发送它们。
-
那么选择的用于处理、发送和检索数据的数据格式需要在服务器端固定。如果 FE-logic 开始修复数据交换格式,那么在中间件/后端处理此类数据已经完全出错了。
标签: javascript json