Deep Merge JSON Data

2.4k Views Asked by At

Is it possible to deep merge a JSON Structure using lift JSON , argonaut , etc

{
"metrics": [{
    "name": "abcde",
    "tags": {
        "oId": ["pqrs"],
        "uuid": ["A123-B234"],
        "entityType": ["test"],
        "entityName": ["test"]
    },
    "aggregators": [{
        "name": "sum",
        "sampling": {
            "value": 40,
            "unit": "seconds"
        }
    }]
}],
"cache_time": 0,
"start_relative": {
    "value": 8,
    "unit": "hours"
}
}

I am attempting to deep merge a new attribute ("instance" : ["PQRSTUW"] ) into "metrics" / "tags" structure

to yield

  {
"metrics": [{
    "name": "abcde",
    "tags": {
        "orgId": ["pqrs"],
        "vcuuid": ["A123-B234"],
        "entityType": ["test"],
        "entityName": ["test"],
        "instance" : ["PQRSTUW"]
    },
    "aggregators": [{
        "name": "sum",
        "sampling": {
            "value": 40,
            "unit": "seconds"
        }
    }]
}],
"cache_time": 0,
"start_relative": {
    "value": 8,
    "unit": "hours"
}
}

Is this possible?

2

There are 2 best solutions below

0
On

You can use Jackson library. See below example:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        ArrayNode instanceArray = new ArrayNode(mapper.getNodeFactory());
        instanceArray.add("PQRSTUW");

        JsonNode rootNode = mapper.readTree("{... json ...}");
        JsonNode metricsNode = rootNode.get("metrics");
        JsonNode firstArrayElement = metricsNode.elements().next();

        ObjectNode tagsNode = (ObjectNode)firstArrayElement.get("tags");
        tagsNode.put("instance", instanceArray);

        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode));
    }
}

Above program prints:

{
  "metrics" : [ {
    "name" : "abcde",
    "tags" : {
      "oId" : [ "pqrs" ],
      "uuid" : [ "A123-B234" ],
      "entityType" : [ "test" ],
      "entityName" : [ "test" ],
      "instance" : [ "PQRSTUW" ]
    },
    "aggregators" : [ {
      "name" : "sum",
      "sampling" : {
        "value" : 40,
        "unit" : "seconds"
      }
    } ]
  } ],
  "cache_time" : 0,
  "start_relative" : {
    "value" : 8,
    "unit" : "hours"
  }
}
0
On

Argonaut has a deepmerge method on the Json type which does exactly that.