【问题标题】:Parse JSON into Map to preserve order of keys [duplicate]将 JSON 解析为 Map 以保留键的顺序 [重复]
【发布时间】: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


【解决方案1】:

您不能更改类似于数组的 32 位整数索引的键的顺序。 Javascript 将它们移动到顶部。

但是您可以将对象作为值并添加所需顺序的属性,例如

json = '{
    "2": { "order": 1, "value": "first" },
    "1": { "order": 2, "value": "second" }
}';

【讨论】:

  • 不幸的是,我无法更改该 JSON 来自的服务器的响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2013-06-03
  • 2017-09-04
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多