JSON在java中解析字符串

时间:2015-02-27 18:59:55

标签: java json parsing arraylist

我将一个字符串传递给一个方法,我需要将它反序列化为一个对象,但我一直在运行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]

有人能给我一些见解吗?

2 个答案:

答案 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);