unmarshal marshal convert camel java json jackson apache-camel

java - marshal - cómo convertir JSONArray a List of Object usando camel-jackson



camel marshal json to pojo (5)

Estoy teniendo el String of json array como sigue

{"Compemployes":[ { "id":1001, "name":"jhon" }, { "id":1002, "name":"jhon" } ]}

Quiero convertir este jsonarray a List<Empolyee> . para esto, había agregado la dependencia de maven " camel-jackson " y también escribí la clase pojo para empleado. pero cuando intento ejecutar mi código de abajo

ObjectMapper mapper = new ObjectMapper(); List<Employe> list = mapper.readValue(jsonString, TypeFactory.collectionType(List.class, Employe.class));

estoy recibiendo la siguiente excepción.

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token at [Source: java.io.StringReader@43caa144; line: 1, column: 1]

alguien puede decir lo que me falta o hacer algo mal


El problema no está en tu código, sino en tu json:

{"Compemployes":[{"id":1001,"name":"jhon"}, {"id":1002,"name":"jhon"}]}

esto representa un objeto que contiene una propiedad Compemployes que es una lista de Empleado. En ese caso, debe crear ese objeto como:

class EmployeList{ private List<Employe> compemployes; (with getter an setter) }

y para deserializar al json simplemente hazlo:

EmployeList employeList = mapper.readValue(jsonString,EmployeList.class);

Si su json debe representar directamente una lista de empleados, debería verse así:

[{"id":1001,"name":"jhon"}, {"id":1002,"name":"jhon"}]

Última observación:

List<Employee> list2 = mapper.readValue(jsonString, TypeFactory.collectionType(List.class, Employee.class));

TypeFactory.collectionType está en desuso , ahora deberías usar algo como:

List<Employee> list = mapper.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(List.class, Employee.class));


También me enfrenté al problema similar con el formato de salida JSON. Este código funcionó para mí con el formato JSON anterior.

package com.test.ameba; import java.util.List; public class OutputRanges { public List<Range> OutputRanges; public String Message; public String Entity; /** * @return the outputRanges */ public List<Range> getOutputRanges() { return OutputRanges; } /** * @param outputRanges the outputRanges to set */ public void setOutputRanges(List<Range> outputRanges) { OutputRanges = outputRanges; } /** * @return the message */ public String getMessage() { return Message; } /** * @param message the message to set */ public void setMessage(String message) { Message = message; } /** * @return the entity */ public String getEntity() { return Entity; } /** * @param entity the entity to set */ public void setEntity(String entity) { Entity = entity; } } package com.test; public class Range { public String Name; /** * @return the name */ public String getName() { return Name; } /** * @param name the name to set */ public void setName(String name) { Name = name; } public Object[] Value; /** * @return the value */ public Object[] getValue() { return Value; } /** * @param value the value to set */ public void setValue(Object[] value) { Value = value; } } package com.test.ameba; import java.io.IOException; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JSONTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String jsonString ="{/"OutputRanges/":[{/"Name/":/"ABF_MEDICAL_RELATIVITY/",/"Value/":[[1.3628407124839714]]},{/"Name/":/" ABF_RX_RELATIVITY/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_Unique_ID_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_FIRST_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_AMEBA_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_Effective_Date_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_AMEBA_MODEL/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_UC_ER_COPAY_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_INN_OON_DED_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_COINSURANCE_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_PCP_SPEC_COPAY_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_INN_OON_OOP_MAX_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_IP_OP_COPAY_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_PHARMACY_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]},{/"Name/":/" ABF_PLAN_ADMIN_ERR/",/"Value/":[[/"CPD/",/"SL Limit/",/"Concat/",1,1.5,2,2.5,3]]}],/"Message/":/"/",/"Entity/":null}"; ObjectMapper mapper = new ObjectMapper(); OutputRanges OutputRanges=null; try { OutputRanges = mapper.readValue(jsonString, OutputRanges.class); } catch (JsonParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("OutputRanges :: "+OutputRanges);; System.out.println("OutputRanges.getOutputRanges() :: "+OutputRanges.getOutputRanges());; for (Range r : OutputRanges.getOutputRanges()) { System.out.println(r.getName()); } } }


Tuve una respuesta similar json proveniente del cliente. Creó una clase de lista principal y una clase POJO.


/* It has been answered in http://.com/questions/15609306/convert-string-to-json-array/33292260#33292260 * put string into file jsonFileArr.json * [{"username":"Hello","email":"[email protected]","credits" * :"100","twitter_username":""}, * {"username":"Goodbye","email":"[email protected]" * ,"credits":"0","twitter_username":""}, * {"username":"mlsilva","email":"[email protected]" * ,"credits":"524","twitter_username":""}, * {"username":"fsouza","email":"[email protected]" * ,"credits":"1052","twitter_username":""}] */ public class TestaGsonLista { public static void main(String[] args) { Gson gson = new Gson(); try { BufferedReader br = new BufferedReader(new FileReader( "C://Temp//jsonFileArr.json")); JsonArray jsonArray = new JsonParser().parse(br).getAsJsonArray(); for (int i = 0; i < jsonArray.size(); i++) { JsonElement str = jsonArray.get(i); Usuario obj = gson.fromJson(str, Usuario.class); //use the add method from the list and returns it. System.out.println(obj); System.out.println(str); System.out.println("-------"); } } catch (IOException e) { e.printStackTrace(); } }


private static String readAll(Reader rd) throws IOException { StringBuilder sb = new StringBuilder(); int cp; while ((cp = rd.read()) != -1) { sb.append((char) cp); } return sb.toString(); } String jsonText = readAll(inputofyourjsonstream); JSONObject json = new JSONObject(jsonText); JSONArray arr = json.getJSONArray("Compemployes");

Su arr se verá así: [{"id": 1001, "nombre": "jhon"}, {"id": 1002, "nombre": "jhon"}] Puede usar:

arr.getJSONObject(index)

para obtener los objetos dentro de la matriz.