Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson将Json映射值解析为字符串或CustomClass_Java_Json_Jackson - Fatal编程技术网

Java 使用Jackson将Json映射值解析为字符串或CustomClass

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{

我收到一个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){...}
    }
}
然后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;
    }
}