我正在将Jackson从1.9.4升级到2.2.0。转换是顺利的,除了我似乎无法对对象工作进行数组解析。在1.9.4我可以这样做:
private List<Subjects> mSubjects;
mSubjects = objectMapper.readValue(subjectsJsonArrayNode, new TypeReference<List<Subjects>>() {});
使用Jackson 2.2.0,我得到一个“无法解决方法”的编译时错误。 Jackson的用于1.9.4的ObjectMapper头文件包含JsonNodes的这些readValue方法:
public <T> T readValue(JsonNode root, java.lang.Class<T> valueType)
public <T> T readValue(JsonNode root, org.codehaus.jackson.type.TypeReference valueTypeRef)
public <T> T readValue(JsonNode root, org.codehaus.jackson.type.JavaType valueType)
杰克逊2.2.0的头文件:
public <T> T readValue(JsonParser jsonParser, java.lang.Class<T> tClass)
public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.TypeReference<?> typeReference)
public final <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.ResolvedType resolvedType)
public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.databind.JavaType javaType)
所以我需要从传递JsonNode切换到JsonParser,但我不太确定如何进行转换。也就是说,我不确定我是否会走正路,因为JsonParser被定义为一个抽象类,所以我甚至无法轻易地初始化一个实例来使用它。
对于那些没有回答的人来说,这里有一个临时的解决方案,我迭代并手动解析每个对象:
private List<Subjects> mSubjects = new ArrayList<Subjects>();
for(JsonNode subjectJsonNode : subjectsJsonArrayNode) {
mSubjects.add(objectMapper.treeToValue(subjectJsonNode, Subject.class));
}
答案 0 :(得分:41)
您只需调用JsonNode.traverse()
方法即可获得JsonParser
。
使用以下简单示例进行测试:
public class App {
public static class Foo {
public int foo;
}
public static void main(String[] args) {
String json = "{\"someArray\":[{\"foo\":5},{\"foo\":6},{\"foo\":7}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
node = node.get("someArray");
TypeReference<List<Foo>> typeRef = new TypeReference<List<Foo>>(){};
List<Foo> list = mapper.readValue(node.traverse(), typeRef);
for (Foo f : list) {
System.out.println(f.foo);
}
}
}
输出:
5
6
7
答案 1 :(得分:1)
我将此方法用于列表:
/**
* Returns a list collection of any specified type
* @param jsonValue the json string content to deserialize
* @param type the type to serialize into
* @return a list of specified type
*/
public List<?> readJSONToList(String jsonValue,Class<?> type){
List<?> objDTOS=null;
try {
//get json content without root name
JsonNode root= objectMapper.readTree(jsonValue).get(getRootName());
TypeFactory tf = objectMapper.getTypeFactory();
JavaType listOfObjs = tf.constructCollectionType(ArrayList.class,type);
objDTOS=objectMapper.readValue(root.traverse(), listOfObjs);
} catch (NullPointerException e) {
Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
} catch (JsonParseException e) {
Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
} catch (IOException e) {
Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
}
return objDTOS;
}