Blockquote
I have below JSON Input Request which has to be group by ID parameter.
Input :
[
{
"ID": "1234",
"CustomerName": "KUMAR",
"BranchName": "HARBOUR",
"SchemeName": "GOLD",
"MobileNumber": "123456789",
"CustomerType": "PRIMARY",
"DedupeFound" : "NO"
},
{
"ID": "1234",
"CustomerName": "SEAN",
"BranchName": "HARBOUR",
"SchemeName": "GOLD",
"MobileNumber": "123456789",
"CustomerType": "SECONDARY",
"DedupeFound" : "YES"
},
{
"ID": "5678",
"CustomerName": "MARK",
"BranchName": "CANTONMENT",
"SchemeName": "DIAMOND",
"MobileNumber": "123456789",
"CustomerType": "PRIMARY",
"DedupeFound" : "NO"
},
{
"ID": "5678",
"CustomerName": "STEVE",
"BranchName": "CANTONMENT",
"SchemeName": "DIAMOND",
"MobileNumber": "123456789",
"CustomerType": "SECONDARY",
"DedupeFound" : "YES"
}
]
The above request needs to be transformed in the below way
- First records to be grouped based on ID Tag and only primary ID's details needs to be displayed
- Inside the ID Record details . I have an DedupeDetails Array for both the customers.
Output
[
{
"ID": "1234",
"CustomerName": "KUMAR", // Only Primary Customer Details for the
"BranchName": "HARBOUR", // ID Tag to be displayed here
"SchemeName": "GOLD",
"MobileNumber": "123456789"
"DedupeDetails": [
{
"CustomerType": "PRIMARY"
"CustomerName": "KUMAR",
"DedupeFound" : "NO"
},
{
"CustomerType": "SECONDARY"
"CustomerName": "SEAN",
"DedupeFound" : "YES"
}
]
},
{
"ID": "5678",
"CustomerName": "MARK",
"BranchName": "CANTONMENT",
"SchemeName": "DIAMOND",
"MobileNumber": "123456789"
"DedupeDetails": [
{
"CustomerType": "PRIMARY"
"CustomerName": "MARK",
"DedupeFound" : "NO"
},
{
"CustomerType": "SECONDARY"
"CustomerName": "STEVE",
"DedupeFound" : "YES"
}
]
}
]
I have started with the java code in apache camel . where I am able to map json string to Object List successfully. I am still clueless on how to do grouping to achieve the output.
Note : I am a newbie to java . Any Suggestions / Corrections are highly recommended.
Java
package com.mycompany.Login;
import java.util.List;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.sql.Timestamp;
import java.io.File;
import java.io.PrintWriter;
import java.sql.Time;
import com.mycompany.Login.*;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mycompany.Dedupe.DedupeRoot.DedupeRes;
public class LoginMapping implements Processor{
public void process(Exchange ex)throws Exception{
try {
String responseString = {Input mentioned in post};
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
List<DedupeRes> dedupe = Arrays.asList(mapper.readValue(responseString, DedupeRes[].class));
int total = dedupe.size();
if (total > 0)
{
for (int i = 0; i < total; i ) {
}
}
ex.getIn().setBody(responseString);
}
catch(Exception e) {
ex.getIn().setHeader("ExpMsg", "Undefined");
throw e;
}
}
}
CodePudding user response:
first you must create DedupeDetail class
public class DedupeDetail {
String CustomerType;
String CustomerName;
String DedupeFound;
public DedupeDetail(String customerType, String customerName, String dedupeFound) {
CustomerType = customerType;
CustomerName = customerName;
DedupeFound = dedupeFound;
}
}
after create DedupeResultFinal with converter
public class DedupeResultFinal {
String ID;
String CustomerName;
String BranchName;
String SchemeName;
String MobileNumber;
List<DedupeDetail> DedupeDetails;
public DedupeResultFinal() {
}
public DedupeResultFinal(List<DedupeDetail> dedupeDetails) {
DedupeDetails = dedupeDetails;
}// ... other constructor and getter and setter
public static DedupeResultFinal convertToFinal(HashMap<String, String> dedupeRes){
DedupeResultFinal dedupeResultFinal = new DedupeResultFinal();
dedupeResultFinal.setBranchName(dedupeRes.get("BranchName"));
dedupeResultFinal.setCustomerName(dedupeRes.get("CustomerName"));
dedupeResultFinal.setID(dedupeRes.get("ID"));
dedupeResultFinal.setMobileNumber(dedupeRes.get("MobileNumber"));
dedupeResultFinal.setSchemeName(dedupeRes.get("SchemeName"));
return dedupeResultFinal;
}
}
and then your method must be like this :
public static void main(String[] args) { try {
String responseString = {Input mentioned in post};
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
List<HashMap<String, String>> dedupe = mapper.readValue(responseString, new ArrayList<String>().getClass());
Map<String, DedupeResultFinal> map = new HashMap<>();
for (HashMap<String, String> dedupeRes : dedupe) {
if (map.get(dedupeRes.get("ID")) != null){
DedupeDetail dedupeDetail = new DedupeDetail(dedupeRes.get("CustomerType"), dedupeRes.get("CustomerName"), dedupeRes.get("DedupeFound"));
map.get(dedupeRes.get("ID")).getDedupeDetails().add(dedupeDetail);
}else {
DedupeDetail dedupeDetail = new DedupeDetail(dedupeRes.get("CustomerType"), dedupeRes.get("CustomerName"), dedupeRes.get("DedupeFound"));
DedupeResultFinal dedupeResultFinal = DedupeResultFinal.convertToFinal(dedupeRes);
List<DedupeDetail> dedupeDetails = new ArrayList<>();
dedupeDetails.add(dedupeDetail);
dedupeResultFinal.setDedupeDetails(dedupeDetails);
map.put(dedupeRes.get("ID"), dedupeResultFinal);
}
}
List<DedupeResultFinal> finalDedup = map.values().stream().collect(Collectors.toList());
System.out.println(finalDedup);
}
catch(Exception e) {
e.printStackTrace();
}
}
CodePudding user response:
Complete code implementation, try it.
public class T {
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public static <T> List<T> parseObjectList(String json, Class<T> clazz) {
try {
return mapper.readValue(
json,
TypeFactory.defaultInstance().constructParametricType(ArrayList.class, clazz)
);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static <T> String toJsonString(T t) {
try {
return mapper.writeValueAsString(t);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
try {
String responseString = "[{\"ID\":\"1234\",\"CustomerName\":\"KUMAR\",\"BranchName\":\"HARBOUR\",\"SchemeName\":\"GOLD\",\"MobileNumber\":\"123456789\",\"CustomerType\":\"PRIMARY\",\"DedupeFound\":\"NO\"},{\"ID\":\"1234\",\"CustomerName\":\"SEAN\",\"BranchName\":\"HARBOUR\",\"SchemeName\":\"GOLD\",\"MobileNumber\":\"123456789\",\"CustomerType\":\"SECONDARY\",\"DedupeFound\":\"YES\"},{\"ID\":\"5678\",\"CustomerName\":\"MARK\",\"BranchName\":\"CANTONMENT\",\"SchemeName\":\"DIAMOND\",\"MobileNumber\":\"123456789\",\"CustomerType\":\"PRIMARY\",\"DedupeFound\":\"NO\"},{\"ID\":\"5678\",\"CustomerName\":\"STEVE\",\"BranchName\":\"CANTONMENT\",\"SchemeName\":\"DIAMOND\",\"MobileNumber\":\"123456789\",\"CustomerType\":\"SECONDARY\",\"DedupeFound\":\"YES\"}]";
List<DedupeRes> list = parseObjectList(responseString, DedupeRes.class);
if (list != null && !list.isEmpty()) {
Map<String, List<DedupeRes>> map = list.stream().collect(Collectors.groupingBy(DedupeRes::getID));
List<Res> resList = new ArrayList<>();
map.forEach((k, v) -> resList.add(listToRes(v)));
responseString = toJsonString(resList);
System.out.println(responseString);
}
} catch (Exception e) {
// xx
e.printStackTrace();
}
}
private static Res listToRes(List<DedupeRes> list) {
Res res = new Res();
res.setDedupeDetails(new ArrayList<>());
for (DedupeRes dedupeRes : list) {
if (Objects.equals("PRIMARY", dedupeRes.getCustomerType())) {
// if you used spring -> BeanUtils.copyProperties(dedupeRes, res);
res.setID(dedupeRes.getID());
res.setBranchName(dedupeRes.getBranchName());
res.setCustomerName(dedupeRes.getCustomerName());
res.setMobileNumber(dedupeRes.getMobileNumber());
res.setSchemeName(dedupeRes.getSchemeName());
}
DedupeDetails details = new DedupeDetails();
//
BeanUtils.copyProperties(dedupeRes, details);
res.getDedupeDetails().add(details);
}
return res;
}
@Data
private static class DedupeRes {
@JsonProperty("ID")
private String ID;
@JsonProperty("CustomerName")
private String CustomerName;
@JsonProperty("BranchName")
private String BranchName;
@JsonProperty("SchemeName")
private String SchemeName;
@JsonProperty("MobileNumber")
private String MobileNumber;
@JsonProperty("CustomerType")
private String CustomerType;
@JsonProperty("DedupeFound")
private String DedupeFound;
}
@Data
private static class Res {
@JsonProperty("ID")
private String ID;
@JsonProperty("CustomerName")
private String CustomerName;
@JsonProperty("BranchName")
private String BranchName;
@JsonProperty("SchemeName")
private String SchemeName;
@JsonProperty("MobileNumber")
private String MobileNumber;
@JsonProperty("dedupeDetails")
private List<DedupeDetails> dedupeDetails;
}
@Data
private static class DedupeDetails {
@JsonProperty("CustomerType")
private String CustomerType;
@JsonProperty("CustomerName")
private String CustomerName;
@JsonProperty("DedupeFound")
private String DedupeFound;
}
}
consule.
[{"ID":"1234","CustomerName":"KUMAR","BranchName":"HARBOUR","SchemeName":"GOLD","MobileNumber":"123456789","dedupeDetails":[{"CustomerType":"PRIMARY","CustomerName":"KUMAR","DedupeFound":"NO"},{"CustomerType":"SECONDARY","CustomerName":"SEAN","DedupeFound":"YES"}]},{"ID":"5678","CustomerName":"MARK","BranchName":"CANTONMENT","SchemeName":"DIAMOND","MobileNumber":"123456789","dedupeDetails":[{"CustomerType":"PRIMARY","CustomerName":"MARK","DedupeFound":"NO"},{"CustomerType":"SECONDARY","CustomerName":"STEVE","DedupeFound":"YES"}]}]