首页 > 解决方案 > 在javascript中的json中获取方括号而不是花括号

问题描述

如果我想在 elasticsearch 脚本中更新对象,那么我需要发送一些奇怪的 JSON 修改(https://discuss.elastic.co/t/updating-an-object-field/110735/2)。我真的不知道那是什么语言,也不知道他们为什么要这样做。

例如,如果输入是

{"id": 2, "name": "John"}

我需要 javascript 中的方法来实现它

["id": 2, "name": "John"]

第一个 sloultion 将是

standardJson.replace('{', '[').replace('}', ']')

但是,我担心值内的大括号,因此上述解决方案将覆盖

"name": "{John"

"name": "[Jonh"

我不希望那样。事实上,我需要这个在通用目的库中,所以我不能只希望这种情况不会发生。

标签: javascriptjsonreplace

解决方案


基于使用Object.entriesArray.prototype.map解析输入对象的显式方法:

const inputData = { "id": 2, "name": "{John}" };

const parsed = `[` +
  Object.entries(inputData)
    .map(v =>
      `"${v[0]}": ` +
      (typeof v[1] === `string` ? `"${v[1]}"` : v[1])
    )
    .join(`, `) +
`]`;

console.log(parsed); // ["id": 2, "name": "{John}"]

要处理嵌套对象,可以使用附加的解析分支递归地运行该过程:

const inputData = { "id": 2, "name": "{John}", "foo": { "bar": "{zoo}" } };

const parse = (data) => `[` +
  Object.entries(data)
    .map(v =>
      `"${v[0]}": ` + (
         typeof v[1] === `string`
          ? `"${v[1]}"`
          : (
            typeof v[1] === "object"
              ? parse(v[1])
              : v[1]
          )
       )
    )
    .join(`, `) +
`]`;

console.log(parse(inputData));
// ["id": 2, "name": "{John}", "foo": ["bar": "{zoo}"]]

嵌套数组也可以用同样的方法处理,只需要再增加1个条件分支。


推荐阅读