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"
}
}
}
}
]
'