Java 使用Jackson将Json映射值解析为字符串或CustomClass
我收到一个Json文件,格式如下:Java 使用Jackson将Json映射值解析为字符串或CustomClass,java,json,jackson,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{
{
"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){...}
}
}
然后fromFile.descriptions.get(“desc2”)的类型是LinkedHashMap,而不是CustomClass.NameVal
如何让Jackson正确解析CustomClass.NameVal描述符的类型(而不是在Jackson读取文件后创建一些封装解析并显式转换LinkedHashMap的类) 试试这个。创建具有名称和值属性的类描述:
public class Description {
private String name;
private double val;
}
现在在CustomClass中执行以下操作:
public class CustomClass {
List<Description> descriptions;
}
公共类CustomClass{
清单说明;
}
就这样。记住创建getter和setter,因为Jackson需要它。您可以尝试以下方法:
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;
}
}
杰克逊能猜到很多事情,但不是这类事情。。。您需要对映射进行注释,以指导jackson如何反序列化该映射的值。它不能将
对象
作为一种值类型来弥补太多!对于我来说,没有什么好方法可以连接到反序列化过程中,识别我的POJO并告诉Jackson解析到该POJO而不是LinkedHashMap?你需要为你想要做的事情编写一个自定义反序列化程序。对于Jackson和Java来说,这完全不是一条快乐的道路。这不会解析提供的Json。“desc1”的值是字符串,而不是字符串/双精度描述。
public class CustomClass {
List<Description> descriptions;
}
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;
}
}