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