javajsonjacksonjson-flattener

Java remove "parent":"somevalue" from flattened json if “parent”:“somevalue” and there also exists a “parent.new”: “somevalue” in same json


I Have json like this :

{
"lastModifiedBy" :"value",
"lastModifiedBy.$oid": "1234567189",
"displayedBy" : 0,
"displayedBy.one" : "Abhi",
"displayedBy.one.new" : "Sammy",
"displayedBy.two":"random_value3",
"a.b":null,
"b.c":null,
"d.e.f":null
}

I only want to keep the longest keys and not the previous state parent without affecting the other keys output I need:

{
"lastModifiedBy.$oid": "1234567189",
"displayedBy.one.new" : "Sammy",
"displayedBy.two":"random_value3",
"a.b":null,
"b.c":null,
"d.e.f":null
}

Is there a way to do this in Jackson or any other java package.?


Solution

  • Try this.

        Map<String, String> map = new HashMap<>();
        map.put("lastModifiedBy", "value");
        map.put("lastModifiedBy.$oid", "1234567189");
        map.put("displayedBy", "0");
        map.put("displayedBy.one", "Abhi");
        map.put("displayedBy.one.new", "Sammy");
        map.put("displayedBy.two", "random_value3");
        map.put("a.b", null);
        map.put("b.c", null);
        map.put("d.e.f", null);
        List<String> removes = new ArrayList<>();
        for (String parent : map.keySet())
            for (String child : map.keySet())
                if (parent != child && child.startsWith(parent)) {
                    removes.add(parent);
                    break;
                }
        for (String key : removes)
            map.remove(key);
        System.out.println(map);
    

    output:

    {a.b=null, d.e.f=null, displayedBy.one.new=Sammy, b.c=null, displayedBy.two=random_value3, lastModifiedBy.$oid=1234567189}