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

More you can find here