jsonpatch добавляет элемент в массив и создает его, если он не существует

Я пытаюсь добавить элемент в массив. Но я не могу гарантировать, что массив уже существует. Так и должно быть создано, если нет.

Этот пример работает:

Источник JSON:

{
  "data": []
}

Патч док:

[{
  "op":"add",
  "path":"/data/-",
  "value": "foo"
}]

Но в этом случае он ничего не добавит:

Источник JSON:

{}

Я попробовал решение, добавив сначала пустой массив, а затем добавив, но это всегда будет очищать существующие записи:

[{
  "op":"add",
  "path":"/scores",
  "value": []
}, 
{
  "op":"add",
  "path":"/scores/-",
  "value": {
    "time":1512545873
    }
}]

Я что-то пропустил или в спецификации нет решения для этого?

1 ответ

Решение

Приятно видеть, что вы используете fast-json-patch. Я поддерживаю эту библиотеку.

Я бы сказал, что вы не можете добиться этого с помощью чистых JSON-патчей. Вам понадобится немного логики в вашем JS. Как следующее:

var doc = {};

var patch = [{
  "op": "add",
  "path": "/scores/-",
  "value": {
    "time": 456
  }
}];

var arr = jsonpatch.getValueByPointer(doc, '/scores');
if (!arr) {
  jsonpatch.applyOperation(doc, {
    "op": "add",
    "path": "/scores",
    "value": []
  });
}

var out = jsonpatch.applyPatch(doc, patch).newDocument;
pre.innerHTML = JSON.stringify(out);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-json-patch/2.0.6/fast-json-patch.min.js"></script>

<pre id="pre"></pre>

В Openshift вы можете сделать это с помощью команды:

oc patch dc/NAME_OF_DC --type=json --patch '
[
  { 
    "op": "add",
    "path": "/spec/template/spec/containers/0/env/-",
    "value": {
      "name": "KUBERNETES_NAMESPACE",
      "valueFrom": {
          "fieldRef": {
              "fieldPath": "metadata.namespace"
          }
      }
    }
  }
]
'

Больше вы можете найти здесь

Другие вопросы по тегам