JSON java 中的字符串解析

JSON String parsing in java

我将一个字符串传递给一个方法,我需要将它反序列化为一个对象,但我将 运行 保存到 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是一个内部class,设置如下:

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]

任何人都可以给我一些见解吗?

Jackson 无法反序列化非静态内部 classes。存在此约束是因为没有通用的方法来实例化此类 classes,因为内部 class 没有默认构造函数。然而,序列化工作正常。

This post提供更详细的推理:

注意一个内部class可以访问外部class的所有成员变量。当我们编写如下代码时

public class Outer {

    // non-static
    class Inner {

    }
}

编译器生成类似于

的东西
public class Outer { ... }

class Outer$Inner {
    private final Outer parent;

    Outer$Inner(Outer p) {
        parent = p;
    }
}

你的新错误来自于

vector = mapper.readValue(json, TypeFactory.collectionType(ArrayList.class, Vector.class));

告诉 Jackson 从 json 反序列化一个 ArrayList<Vector>。您的 json 值包含一个 JSON 对象。 List 类型只能从 JSON 数组反序列化。

只需使用

vector = mapper.readValue(json, Vector.class);