Получите квадратные скобки вместо фигурных в json в javascript - PullRequest
0 голосов
/ 25 марта 2020

Если я хочу обновить объект в скрипте эластичного поиска, мне нужно отправить несколько странных изменений JSON (https://discuss.elastic.co/t/updating-an-object-field/110735/2). Я действительно не знаю, что это за язык или зачем они это делают.

Например, если ввод

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

Мне нужен путь в javascript, чтобы сделать это

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

Первая девальвация будет

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

Однако меня беспокоят фигурные скобки внутри значений, поэтому решение выше переопределит

"name": "{John"

на

"name": "[Jonh"

И я этого не хочу. На самом деле, мне нужно это в библиотеке общего пурпурного, так что я не могу просто надеяться, что это не произойдет.

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Явный подход, основанный на разборе входных объектов с Object.entries и Array.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 ветвь условия.

0 голосов
/ 30 марта 2020

Основываясь на опубликованных здесь ответах, мы пришли к окончательному решению, которое является более читабельным и обрабатывает некоторые случаи, не обработанные в предыдущих ответах (логические, нулевые, числа, неопределенные, вложенные массивы и т. Д. c)

function toElasticStupidJson(data) {
    if(isPrimitive(data)) return primitiveDisplay(data)
    else if(typeof data === 'object') return objectDisplay(data)
}

function objectDisplay(data) {
    let inner = ''
    if(Array.isArray(data)) inner = data.filter(d => d !== undefined).map(toElasticStupidJson).join(', ')
    else inner = Object.entries(data)
        .filter(keyValue => keyValue[1] !== undefined)
        .map(keyValue => {
            return `"${keyValue[0]}": ` + toElasticStupidJson(keyValue[1])
        })
        .join(', ')
    return `[${inner}]`
}

function isPrimitive(value) {
    return typeof value === 'string'
        || typeof value === 'number'
        || typeof value === 'boolean'
        || value === null
}

function primitiveDisplay(value) {
    if(typeof value === 'string') return `"${value}"`
    if(typeof value === 'number') return `${value}`
    if(typeof value === 'boolean') return `${value}`
    if(value === null) return 'null'
}

0 голосов
/ 25 марта 2020

Попробуйте, это только изменит внешние фигурные скобки на скобки.

let a =`{"id": 2, "name": "{John}" }` 
console.log(a.replace(/^\{(.*)\}$/,"[$1]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...