我正在将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)
还有Jackson 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));
}
您可以简单地调用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句