如何将JSONArray转换为使用camel-jackson的对象列表
有json数组的string如下
{"Compemployes":[ { "id":1001, "name":"jhon" }, { "id":1002, "name":"jhon" } ]}
我想把这个jsonarray转换成List<Empolyee>
Empolyee List<Empolyee>
。 为此,我添加了Maven依赖项“ camel-jackson
”,并为员工编写pojo类。 但是当我尝试运行我的下面的代码
ObjectMapper mapper = new ObjectMapper(); List<Employe> list = mapper.readValue(jsonString, TypeFactory.collectionType(List.class, Employe.class));
我得到以下例外。
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]
有人可以告诉我什么是错过或做任何错误
问题不在于你的代码,而是在你的json中:
{"Compemployes":[{"id":1001,"name":"jhon"}, {"id":1002,"name":"jhon"}]}
这表示一个包含属性Compemployes的对象,这是一个Employee列表。 在这种情况下,你应该创build这样的对象:
class EmployeList{ private List<Employe> compemployes; (with getter an setter) }
并简单地反序列化json:
EmployeList employeList = mapper.readValue(jsonString,EmployeList.class);
如果你的json应该直接代表一个员工列表,它应该是这样的:
[{"id":1001,"name":"jhon"}, {"id":1002,"name":"jhon"}]
最后一句话:
List<Employee> list2 = mapper.readValue(jsonString, TypeFactory.collectionType(List.class, Employee.class));
TypeFactory.collectionType
已被弃用,您现在应该使用类似于:
List<Employee> list = mapper.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(List.class, Employee.class));
/* It has been answered in http://stackoverflow.com/questions/15609306/convert-string-to-json-array/33292260#33292260 * put string into file jsonFileArr.json * [{"username":"Hello","email":"hello@email.com","credits" * :"100","twitter_username":""}, * {"username":"Goodbye","email":"goodbye@email.com" * ,"credits":"0","twitter_username":""}, * {"username":"mlsilva","email":"mlsilva@email.com" * ,"credits":"524","twitter_username":""}, * {"username":"fsouza","email":"fsouza@email.com" * ,"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(); } }
我也遇到了与JASON输出格式类似的问题。 这段代码使用上面的JSON格式。
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()); } } }
我有类似的json响应来自客户端。 创build了一个主要的列表类和一个POJO类。
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");
你的arr看起来像:[{“id”:1001,“name”:“jhon”},{“id”:1002,“name”:“jhon”}]你可以使用:
arr.getJSONObject(index)
获取数组内的对象。