2017-12-06 19 views
0

要素を配列に追加しようとしています。しかし、私は配列alreadが存在することを確認することはできません。したがって、作成しない場合は作成する必要があります。jsonpatch配列に要素を追加し、要素が存在しない場合に作成する

この例では動作します:

ソースJSON:

{ 
    "data": [] 
} 

パッチドキュメント:

ソースJSON::

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

しかし、この場合には、それは何も追加しません

{} 

私が最初に空の配列を追加し、追加することで解決策が、これは常に明確な既存のエントリを試してみました:

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

は、私が何かを逃したか、スペックで、このための解決策が存在しないことがありますか?

+0

あなたのパッチが完全に右です。あなたはここでそれを試すことができます:https://json8.github.io/patch/demos/apply/ –

+0

多分私の質問は十分詳細ではありません。私の例は働いていますが、結果は私が必要とするものではありません。 これは、ある要素を別の要素に追加するための実例です:https://jsfiddle.net/s22ksqf8/ソース文書が空の場合、これは機能しません。 2番目の例(https://jsfiddle.net/67xLty9n/)を使用すると、追加された項目のみが結果ドキュメントに表示されます – nblum

+0

ああ、私はあなたの質問を誤解しました。あなたは純粋なパッチでこれを行うことはできません、あなたはあなたのJSでいくつかのロジックが必要になります。私は答えを書くつもりです。 –

答えて

0

あなたは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>

+1

okは現在このようなソリューションを使用しています。私はこれを行う直接的な方法があることを望んだ。しかし、あなたの返事をありがとう – nblum

関連する問題