我将一个字符串传递给一个方法,我需要将它反序列化为一个对象,但我一直在运行JSON映射异常。
private static final ObjectMapper mapper = new ObjectMapper();
public ArrayList<Double> parseVector(String json){
Vector vector = new Vector();
try {
vector = mapper.readValue(json, TypeFactory.collectionType(ArrayList.class, Vector.class));
} catch ETC ........
还应该注意Vector是一个内部类,设置如下:
static class Vector{
@JsonProperty("P")
public Double performance;
@JsonProperty("M")
public Double margin;
@JsonProperty("I")
public Double pace;
}
对于此示例,json的值为:
{'P':8,'M':2,'I':0}
我得到了这个例外:
JSONDeserializer : getVectorMap() JsonMappingException :
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [Source: java.io.StringReader@77d65595; line: 1, column: 1]
有人能给我一些见解吗?
答案 0 :(得分:0)
杰克逊无法反序列化非静态内部类。这种约束是存在的,因为没有通用的方法来实例化这样的类,因为内部类没有默认的构造函数。然而,序列化工作正常。
This post提供了更详细的推理:
请注意,内部类可以访问外部类的所有成员变量。当我们编写以下代码时
public class Outer {
// non-static
class Inner {
}
}
编译器会生成类似于
的内容public class Outer { ... }
class Outer$Inner {
private final Outer parent;
Outer$Inner(Outer p) {
parent = p;
}
}
答案 1 :(得分:0)
您的新错误来自
vector = mapper.readValue(json, TypeFactory.collectionType(ArrayList.class, Vector.class));
告诉杰克逊从ArrayList<Vector>
反序列化json
。您的json
值包含JSON对象。 List
类型只能从JSON数组中反序列化。
只需使用
vector = mapper.readValue(json, Vector.class);