【问题标题】:Marklogic - Update within an array of element of a json using java apiMarklogic - 使用 java api 在 json 的元素数组中更新
【发布时间】:2016-10-24 08:51:42
【问题描述】:

假设我们的 json 看起来像

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

我已经尝试过 DocumentPatchBuilder 的 insertFragment。使用它我可以在 json 属性之前/之后更新。但是我必须在数组类型的属性 workInformation 中插入。这是我尝试过的 insertFragment 示例 -

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

我想使用 java api 在 workInformation 部分中插入下面提到的数据 -

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

请告诉我怎么做。

感谢阅读。

【问题讨论】:

  • 是否可以在服务器端 JavaScript 中执行此操作?然后是一个简单的var x = fn.doc(...); x['workInformation'].push({'address': ...}); xdmp.save(...)。 SJS 与 JSON 配合得非常好。
  • 我想用 Java API 来做。如果您可以参考任何示例/文档,那将会很有帮助。

标签: json jackson marklogic marklogic-8


【解决方案1】:

要在 workInformation 数组中插入,您需要将位置指定为 POSITION.LAST_CHILD 以将其作为上下文子列表的最后一个子元素插入。此外,您需要在 patchBuilder.insertFragment - ["workInformation"] 的第一个参数中将“workInformation”指定为数组类型。代码类似于:

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);

这应该可以解决问题,并且会插入

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

在“workInformation”属性的末尾。

【讨论】:

  • Vivek 我必须在数组数组中插入片段。我已经更新了我的 json,现在它在 workInformation 数组中包含了引用数组。我试过 pb.insertFragment("$.[\"workInformaiton\"][1].[\"reference\"]", Position.LAST_CHILD, fragment);它不工作。你能告诉我如何使它与数组类型的数组一起工作吗?
  • 我已经尝试过了,它奏效了 - [\"workInformaiton\"][0][\"reference\"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多