Чтение вложенного элемента JSON с использованием отражения без использования JsonFactory или ObjectMapper - PullRequest
0 голосов
/ 17 сентября 2018

[Невозможно получить доступ к свойству другого объекта, хранящегося в Arraylist] Я создаю функцию для получения входных данных JSON в объекте из входных данных веб-службы RESTful и снова форматирую их в формате JSON для вызова другой веб-службы.

У меня есть ограничение, что я не могу использовать какой-либо JSON API для сопоставления объектов, поэтому использую базовый API-интерфейс отражения Java.

Я могу создать формат JSON из Input для простых элементов, но не могу получить доступ к вложеннымэлементы (другой пользовательский класс POJO).Я использую arraylist.

Ввод

{
  "GenesisIncidents": {
"service": "Transmission",
"affectedCI": "22BT_ORNC03",
"opt_additionalAffectedItems": [
   {
      "itemType": "NODE-ID",
      "ItemName": "22BT_ORNC03"
   },
   {
      "ItemType": "CCT",
      "ItemName": "A_circuit_id"
        }]   
}
}

GenesisIncidents.class

import java.util.ArrayList;
import java.util.Date;
public class GenesisIncidents {

private String service;
private String affectedCI;
private ArrayList<AdditionalAffectedItems> opt_additionalAffectedItems;

public GenesisIncidents(){}

public String getService() {
    return service;
}

public void setService(String service) {
    this.service = service;
}

public String getAffectedCI() {
    return affectedCI;
}

public void setAffectedCI(String affectedCI) {
    this.affectedCI = affectedCI;
}


public ArrayList<AdditionalAffectedItems> getOpt_additionalAffectedItems() {
    return opt_additionalAffectedItems;
}
public void setOpt_additionalAffectedItems(ArrayList<AdditionalAffectedItems> opt_additionalAffectedItems) {
    this.opt_additionalAffectedItems = opt_additionalAffectedItems;
}
}

AdditionalActedItems.class

public class AdditionalAffectedItems {

private String itemType;
private String itemName;

public AdditionalAffectedItems(){
    super();
}

public String getItemType() {
    return itemType;
}

public void setItemType(String itemType) {
    this.itemType = itemType;
}

public String getItemName() {
    return itemName;
}

public void setItemName(String itemName) {
    this.itemName = itemName;
}
}

Реализация

public void updateTicketExt(GenesisIncidents genesisIncidents) {
        try{

            Field allFields[]=genesisIncidents.getClass().getDeclaredFields();
            Method allMethods[] = genesisIncidents.getClass().getDeclaredMethods();
            String jsonString ="{\r\n \""+genesisIncidents.getClass().getName().toString().substring(48)+"\": {";
            final String preStr="\r\n  \"";             //To create a JSON object format.
            final String postStr="\": ";                //To create a JSON object format.
            int totalNoOfFields=allFields.length;

            for (Field field : allFields) {
                System.out.println(field.getType());
                String getter="get"+StringUtils.capitalize(field.getName());
                Method method= genesisIncidents.getClass().getMethod(getter, null);
                try{

                        if(field.getType().toString().contains("Integer"))
                            jsonString=jsonString + preStr + field.getName() + postStr +method.invoke(genesisIncidents).toString()+",";
                        else
                            jsonString=jsonString + preStr + field.getName() + postStr +"\""+method.invoke(genesisIncidents).toString()+"\",";

                        if(field.getType().toString().contains("ArrayList")){
                            System.out.println("ArrayListElement found");
                            genesisIncidents.getOpt_additionalAffectedItems().forEach(obj->{System.out.println(obj.getItemName());});
                            //convertArrayToJSON(field, genesisIncidents);
                        }

                }catch(NullPointerException npe)
                {
                    System.out.println("Null value in field.");
                    continue;
                }
                }
                jsonString=jsonString.substring(0,jsonString.length()-1);
                jsonString=jsonString+"\r\n }\r\n }";
                System.out.println("\n"+jsonString);
            }catch(Exception jex){
            jex.printStackTrace();
        }

    }

Моя строка кода ниже не может получить доступ к объекту, хранящемуся в списке массивов.

genesisIncidents.getOpt_additionalAffectedItems().forEach(obj->{System.out.println(obj.getItemName());});

OUTPUT

karaf@root>class java.lang.String
class java.lang.String
class java.lang.String
class java.util.ArrayList
ArrayListElement found
null
null
{
 "GenesisIncidents": {
  "service": "Transmission",
  "affectedCI": "22BT_ORNC03",
  "opt_additionalAffectedItems": "    [org.apache.servicemix.examples.camel.rest.model.AdditionalAffectedItems@5881a    895,     org.apache.servicemix.examples.camel.rest.model.AdditionalAffectedItems@399b4e    eb]"
 }
 }

1 Ответ

0 голосов
/ 17 сентября 2018

Я возился с вашим примером, мне удалось заставить его работать. Это создаст правильную строку JSON, передав экземпляр GenesisIncident объекта. Я предполагаю, что здесь есть много возможностей для улучшения, но это может служить примером.

public static String genesisToJson(GenesisIncidents incidents) {
    try{
        StringBuilder jsonBuilder = new StringBuilder();
        jsonBuilder.append("{\r\n \"")
        .append(incidents.getClass().getSimpleName())
        .append("\": {");
        Field allFields[] = incidents.getClass().getDeclaredFields();
        for (Field field : allFields) {
        String getter = getGetterMethod(field);
        Method method = incidents.getClass().getMethod(getter, null);
        try{
            if(field.getType().isAssignableFrom(Integer.class)) {
            jsonBuilder.append(preStr).append(field.getName()).append(postStr)
                .append(method.invoke(incidents).toString()).append(",");
            } else if (field.getType().isAssignableFrom(String.class)) {
            jsonBuilder.append(preStr).append(field.getName()).append(postStr).append("\"")
                .append(method.invoke(incidents).toString()).append("\",");
            } else if (field.getType().isAssignableFrom(List.class)) {
            System.out.println("ArrayListElement found");
            getInnerObjectToJson(field, incidents.getOptItems(), jsonBuilder);
            }
        } catch(NullPointerException npe) {
            System.out.println("Null value in field.");
            continue;
        }
        }
        jsonBuilder.append("\r\n } \r\n }");
        return jsonBuilder.toString();
    }catch(Exception jex){
        jex.printStackTrace();
    }
    return null;
    }

    private static void getInnerObjectToJson(Field field, List<AdditionalAffectedItems> items, StringBuilder builder)
    throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    builder.append(preStr).append(field.getName()).append(postStr).append("[");
    for (var item : items) {
        var fields = List.of(item.getClass().getDeclaredFields());
        builder.append("{");
        for (var f : fields) {
            String getter = getGetterMethod(f);
            Method method = item.getClass().getMethod(getter, null);
            builder.append(preStr).append(f.getName()).append(postStr).append("\"")
            .append(method.invoke(item).toString()).append("\"");
        if (!(fields.indexOf(f) == (fields.size() - 1))) {
            builder.append(",");
        }
        }
        if (items.indexOf(item) == (items.size() - 1)) {
        builder.append("}\r\n");
        } else {
            builder.append("},\r\n");
        }
    }
    builder.append("]");
    }

    private static String getGetterMethod(Field field) {
        return "get" + StringUtils.capitalize(field.getName());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...