jsonpatch 将元素添加到数组并在不存在时创建它
jsonpatch adding element to array and creating it if not exist
我正在尝试将元素附加到数组。但我不能确保数组已经存在。所以如果没有就应该创建。
这个例子有效:
来源json:
{
"data": []
}
补丁文档:
[{
"op":"add",
"path":"/data/-",
"value": "foo"
}]
但在这种情况下,它不会附加任何内容:
来源json:
{}
我尝试了一个解决方案,首先添加一个空数组然后追加,但这将始终清除现有条目:
[{
"op":"add",
"path":"/scores",
"value": []
},
{
"op":"add",
"path":"/scores/-",
"value": {
"time":1512545873
}
}]
我是不是漏掉了什么或者规范中没有解决这个问题的方法?
很高兴看到您使用 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"
}
}
}
}
]
'
我正在尝试将元素附加到数组。但我不能确保数组已经存在。所以如果没有就应该创建。
这个例子有效:
来源json:
{
"data": []
}
补丁文档:
[{
"op":"add",
"path":"/data/-",
"value": "foo"
}]
但在这种情况下,它不会附加任何内容:
来源json:
{}
我尝试了一个解决方案,首先添加一个空数组然后追加,但这将始终清除现有条目:
[{
"op":"add",
"path":"/scores",
"value": []
},
{
"op":"add",
"path":"/scores/-",
"value": {
"time":1512545873
}
}]
我是不是漏掉了什么或者规范中没有解决这个问题的方法?
很高兴看到您使用 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"
}
}
}
}
]
'