Search code examples
javaarraysjsonhashmapmultimap

How to return json object having particular value in java?


This is what I have as a json and I have one condition here to ignore the object which has object_name:[parent],I had tried somthing which didnt worked out can someone help me with the same

    [
  {
    "object_group": "Trans",
    "permission_values": [
      {
        "object_type": "Trans",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      },
      {
        "object_type": "Trans",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "parent"
        ]
      }
    ]
  },
  {
    "object_group": "General",
    "permission_values": [
      {
        "object_type": "General",
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "object_type": "General",
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
]

This is the actual Thing I tried which I got as from one I have one condition here to ignore the object which has object_name :[parent]

 import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.json.JSONArray;
import org.json.JSONObject;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
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 TestData {

    public static void main(String[] args) throws JsonMappingException, JsonProcessingException {

         String input = "{\"JSON_OBJECT\":[{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Invoice\"]},{\"object_type\":\"General\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Customer\"]},{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Payments\"]},{\"object_type\":\"General\",\"permission_type\":[{\"Delete\":true}],\"object_name\":[\"Product\"]}]}";
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(input);
            Iterator<JsonNode> jsonObject = jsonNode.get("JSON_OBJECT").iterator();
            ObjectNode objectNode = objectMapper.createObjectNode();

            while (jsonObject.hasNext()) {
                JsonNode node = jsonObject.next();
                String object_type = node.path("object_type").asText();
                if (objectNode.has(object_type)) {
                    JsonNode objectTypeNode = objectNode.get(object_type);
                    JsonNode permission_values = objectTypeNode.path("permission_values");
                    if (!permission_values.isMissingNode()) {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                        ((ArrayNode) permission_values).add(permissionNode);
                    } else {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                        ((ArrayNode) permission_values).add(permissionNode);
                    }
                } else {
                    ArrayNode permissionArrayNode = objectMapper.createArrayNode();
                    ObjectNode permissionNode = objectMapper.createObjectNode();
                    node.fields().forEachRemaining(kv -> permissionNode.set(kv.getKey(),kv.getValue()));
                    permissionArrayNode.add(permissionNode);
                    ObjectNode permNode = objectMapper.createObjectNode();
                    permNode.set("permission_values", permissionArrayNode);
                    objectNode.set(object_type, permNode);
                }
            }
            ArrayNode arrayNode = objectMapper.createArrayNode();
            objectNode.fieldNames().forEachRemaining(key ->{
                ObjectNode node = objectMapper.createObjectNode();
                node.put("object_group",key);
                objectNode.get(key).fields().forEachRemaining(kv -> node.set(kv.getKey(),kv.getValue()));
                arrayNode.add(node);
            });
            System.out.println(arrayNode.toString());
    }
}

Expected output:- can someone pls help me to get this output ..

[
  {
    "object_group": "Trans",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Invoice"
        ]
      }
    ]
  },
  {
    "object_group": "General",
    "permission_values": [
      {
        "permission_type": [
          {
            "View": true
          }
        ],
        "object_name": [
          "Customer"
        ]
      },
      {
        "permission_type": [
          {
            "Delete": true
          }
        ],
        "object_name": [
          "Product"
        ]
      }
    ]
  }
]

Solution

  • If you don't want to create POJOs, you have to play with general json object or Map. I have used Jackson library to get the output. Please see If this is what you want. Since expected output is of not a proper json, I have modified to get below output.

        String input = "{\"JSON_OBJECT\":[{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Invoice\"]},{\"object_type\":\"General\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Customer\"]},{\"object_type\":\"Trans\",\"permission_type\":[{\"View\":true}],\"object_name\":[\"Payments\"]},{\"object_type\":\"General\",\"permission_type\":[{\"Delete\":true}],\"object_name\":[\"Product\"]}]}";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(input);
        Iterator<JsonNode> jsonObject = jsonNode.get("JSON_OBJECT").iterator();
        ObjectNode objectNode = objectMapper.createObjectNode();
    
                    while (jsonObject.hasNext()) {
                JsonNode node = jsonObject.next();
                String object_type = node.path("object_type").asText();
                if (objectNode.has(object_type)) {
                    JsonNode objectTypeNode = objectNode.get(object_type);
                    JsonNode permission_values = objectTypeNode.path("permission_values");
                    if (!permission_values.isMissingNode()) {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                        ((ArrayNode) permission_values).add(permissionNode);
                    } else {
                        ObjectNode permissionNode = objectMapper.createObjectNode();
                        node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                        ((ArrayNode) permission_values).add(permissionNode);
                    }
                } else {
                    ArrayNode permissionArrayNode = objectMapper.createArrayNode();
                    ObjectNode permissionNode = objectMapper.createObjectNode();
                    node.fields().forEachRemaining(kv -> addIfRequired(permissionNode, kv));
                    permissionArrayNode.add(permissionNode);
                    ObjectNode permNode = objectMapper.createObjectNode();
                    permNode.set("permission_values", permissionArrayNode);
                    objectNode.set(object_type, permNode);
                }
            }
    
        System.out.println(objectNode.toString());
    

    Edit 3

    private static void addIfRequired(ObjectNode permissionNode, Map.Entry<String, JsonNode> kv) {
        if (!("object_name".equalsIgnoreCase(kv.getKey()) && kv.getValue().get(0).asText().toLowerCase().contains("parent"))) {
            permissionNode.set(kv.getKey(), kv.getValue());
        }
    }
    

    //output

    {
      "Trans": {
        "permission_values": [
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Invoice"
            ]
          },
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Payments"
            ]
          }
        ]
      },
      "General": {
        "permission_values": [
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Customer"
            ]
          },
          {
            "permission_type": [
              {
                "Delete": true
              }
            ],
            "object_name": [
              "Product"
            ]
          }
        ]
      }
    }
    

    Edit: Assuming you need array as output

        ArrayNode arrayNode = objectMapper.createArrayNode();
        objectNode.fieldNames().forEachRemaining(key ->{
            ObjectNode node = objectMapper.createObjectNode();
            node.put("object_group",key);
            objectNode.get(key).fields().forEachRemaining(kv -> node.set(kv.getKey(),kv.getValue()));
            arrayNode.add(node);
        });
        System.out.println(arrayNode.toString());
    

    //output

    [
      {
        "object_group": "Trans",
        "permission_values": [
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Invoice"
            ]
          },
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Payments"
            ]
          }
        ]
      },
      {
        "object_group": "General",
        "permission_values": [
          {
            "permission_type": [
              {
                "View": true
              }
            ],
            "object_name": [
              "Customer"
            ]
          },
          {
            "permission_type": [
              {
                "Delete": true
              }
            ],
            "object_name": [
              "Product"
            ]
          }
        ]
      }
    ]