2016-06-22 15 views
2

Können sagen, wir haben json wieMarklogic - Update innerhalb einer Anordnung von Element eines json java api mit

{ 
    "name":"abc", 
    "lastName":"xyz", 
    "description":"aaaaa aaaa", 
    "dob":11-10-1988, 
    "workInformation":[ 
     { 
      "address":"kolkata", 
      "workFor":"vvv Pvt Ltd", 
      "reference" : [ 
       { 
       "refName" : "ttt", 
       "refId" : "12345" 
       }, 
       { 
       "refName" : "sss", 
       "refId" : "23412" 
       } 
      ] 
     }, 
     { 
      "address":"bangalore", 
      "workFor":"www Pvt Ltd", 
      "reference" : [ 
       { 
       "refName" : "rrr", 
       "refId" : "43434" 
       }, 
       { 
       "refName" : "yyyy", 
       "refId" : "34213" 
       } 
      ] 
     }, 
     { 
      "address":"delhi", 
      "workFor":"sss Pvt Ltd", 
      "reference" : [ 
       { 
       "refName" : "qqqq", 
       "refId" : "76767" 
       }, 
       { 
       "refName" : "gggg", 
       "refId" : "65432" 
       } 
      ] 
     } 
    ] 
} 

sieht ich insertFragment von DocumentPatchBuilder versucht haben. Damit kann ich die JSON-Eigenschaften vorher/nachher aktualisieren. Aber ich muss in die Eigenschaft workInformation einfügen, die vom Array-Typ ist. Hier ist das insertFragment Beispiel, das ich versuchte -

DocumentPatchBuilder pb = docMgr.newPatchBuilder(); 
pb.pathLanguage(DocumentPatchBuilder.PathLanguage.JSONPATH); 
ObjectMapper mapper = new ObjectMapper(); 
pb.insertFragment("workInformation", Position.BEFORE,mapper.createObjectNode().put("hello", "hai")); 

Ich wollte unten im Inneren des workInformation Abschnitt mit Java api genannten Daten einfügen -

{ 
      "address":"Mumbai", 
      "workFor":"zzz Pvt Ltd" 
    } 

Bitte lassen Sie mich wissen, wie es zu tun.

Danke für das Lesen.

+0

Ist dies im serverseitigen JavaScript möglich? Dann ist es ein einfaches 'var x = fn.doc (...); x ['workInformation']. push ({'adresse': ...}); xdmp.save (...) '. SJS funktioniert sehr gut mit JSON. – scotthenninger

+0

Ich möchte es in Java API tun. Wenn Sie ein Beispiel/eine Dokumentation verwenden können, ist es hilfreich. – RCS

Antwort

5

Um in das workInformation-Array einzufügen, müssen Sie die Position als POSITION.LAST_CHILD angeben, um sie als letztes Kind der untergeordneten Liste des Kontexts einzufügen. Außerdem müssten Sie "workInformation" als Array-Typ im ersten Argument von patchBuilder.insertFragment - ["workInformation"] angeben. Der Code wäre so etwas wie:

DocumentPatchBuilder pb = docMgr.newPatchBuilder(); 
pb.pathLanguage(DocumentPatchBuilder.PathLanguage.JSONPATH); 
ObjectMapper mapper = new ObjectMapper(); 

ObjectNode fragmentNode = mapper.createObjectNode(); 
fragmentNode = mapper.createObjectNode(); 
fragmentNode.put("address", "mumbai"); 
fragmentNode.put("workFor", "zzz Pvt Ltd"); 
String fragment = mapper.writeValueAsString(fragmentNode); 

pb.insertFragment("$.[\"workInformation\"]", Position.LAST_CHILD, fragment); 

Diese den Trick tun sollten, und diese

{ 
    "address":"Mumbai", 
    "workFor":"zzz Pvt Ltd" 
} 

am Ende der "workInformation" Eigenschaft einfügen würde.

+0

Vielen Dank, es hat funktioniert. – RCS

+0

Vivek Ich muss ein Fragment in Array-Array einfügen. Ich habe meine JSON aktualisiert, jetzt enthält es Referenz-Array innerhalb der WorkInformation -Array. Ich habe versucht pb.insertFragment ("$. [\ WorkInformaiton \"] [1]. [\ "Referenz \"] ", Position.LAST_CHILD, Fragment); Es funktioniert nicht. Kannst du mir sagen, wie man es mit einem Array Array-Typ arbeiten lassen? – RCS

+0

Ich habe es versucht und es hat funktioniert - [\ "workInformaiton \"] [0] [\ "reference \"] – RCS