使用Jackson将Json映射值解析为String或CustomClass

时间:2013-06-10 22:54:08

标签: java json jackson

我将获得一个表格为:

的Json文件
{
    "descriptions": {
        "desc1": "someString",
        "desc2": {"name":"someName", "val": 7.0}
    }
}

我有POJO:

public class CustomClass {
    Map<String, Object> descriptions;
    public static class NameVal{
        String name;
        double val;
        public NameVal(String name, double val){...}
    }
}

我可以使用代码重新创建json文件:

CustomClass a = new CustomClass();
a.descriptions = new HashMap<String, Object>();
a.descriptions.put("desc1", "someString");
a.descriptions.put("desc2", new CustomClass.NameVal("someName", 7.0));
new ObjectMapper().writeValue(new File("testfile"), a);

但是,当我使用以下内容阅读对象时:

CustomClass fromFile = new ObjectMapper().readValue(new File("testfile"), CustomClass.class);

然后fromFile.descriptions.get(“desc2”)的类型为LinkedHashMap,而不是CustomClass.NameVal类型。

如何让Jackson正确解析CustomClass.NameVal描述符的类型(除了制作一些包装解析并在Jackson读取文件后显式转换LinkedHashMap的类)?

2 个答案:

答案 0 :(得分:0)

试试这个。创建一个具有名称和值属性的类描述:

public class Description {
    private String name;
    private double val;
}

现在在CustomClass中执行此操作:

public class CustomClass {
     List<Description> descriptions;
}

就是这样。记得创建getter和setter因为Jackson需要它。

答案 1 :(得分:0)

您可以尝试这样的事情:

public class DescriptionWrapper {
    private Description descriptions;

    public Description getDescriptions() {
        return descriptions;
    }

    public void setDescriptions(Description descriptions) {
        this.descriptions = descriptions;
    }
}

public class Description {
    private String desc1;
    private NameValue desc2;

    public String getDesc1() {
        return desc1;
    }

    public void setDesc1(String desc1) {
        this.desc1 = desc1;
    }

    public NameValue getDesc2() {
        return desc2;
    }

    public void setDesc2(NameValue desc2) {
        this.desc2 = desc2;
    }
}

public class NameValue {
    private String name;
    private double val;

    public String getName() {
         return name;
    }

    public void setName(String name) {
         this.name = name;
    }

    public double getVal() {
         return val;
    }

    public void setVal(double val) {
         this.val = val;
    }
}