Json “杰克逊”;无单字符串构造函数/工厂方法“;例外

Json “杰克逊”;无单字符串构造函数/工厂方法“;例外,json,jackson,Json,Jackson,我有一个实体: E{ String screen; } 我需要将screen字段分配给作为json字符串接收的一个值 “screen”:{“ldpi”:“1.jpg”、“mdpi”:“2.jpg”、“hdpi”:“3.jpg”、“xhdpi”:“4.jpg”} 不幸的是,我不能只声明字符串而声明容器类,因为orm系统使用E类 为了实现这一点,我创建了自定义值反序列化器: public class DensityDeserializer extends JsonDeserializer&

我有一个实体:

E{
    String screen;
}
我需要将screen字段分配给作为json字符串接收的一个值

“screen”:{“ldpi”:“1.jpg”、“mdpi”:“2.jpg”、“hdpi”:“3.jpg”、“xhdpi”:“4.jpg”}

不幸的是,我不能只声明字符串而声明容器类,因为orm系统使用E类

为了实现这一点,我创建了自定义值反序列化器:

public class DensityDeserializer extends JsonDeserializer<String> {

    public final static int LDPI = 0;
    public final static int MDPI = 1;
    public final static int HDPI = 2;
    public final static int XHDPI = 3;

    private int mDensity = LDPI;

    public DensityDeserializer() {
    }

    public DensityDeserializer(int density) {
        mDensity = density;
    }

    @Override
    public String deserialize(JsonParser jsonparser,
            DeserializationContext deserializationcontext) throws IOException,
            JsonProcessingException {
        ScreenContainer screenContainer = jsonparser
                .readValueAs(ScreenContainer.class);
        switch (mDensity) {
        default:
            return "";
        case LDPI:
            return screenContainer.getLdpi();
        case MDPI:
            return screenContainer.getHdpi();
        case HDPI:
            return screenContainer.getHdpi();
        case XHDPI:
            return screenContainer.getXhdpi();
        }
    }

    public static class ScreenContainer {
        public String ldpi = "";
        public String mdpi = "";
        public String hdpi = "";
        public String xhdpi = "";

        public ScreenContainer() {
            // TODO Auto-generated constructor stub
        }

        public String getLdpi() {
            return ldpi;
        }

        public void setLdpi(String ldpi) {
            this.ldpi = ldpi;
        }

        public String getMdpi() {
            return mdpi;
        }

        public void setMdpi(String mdpi) {
            this.mdpi = mdpi;
        }

        public String getHdpi() {
            return hdpi;
        }

        public void setHdpi(String hdpi) {
            this.hdpi = hdpi;
        }

        public String getXhdpi() {
            return xhdpi;
        }

        public void setXhdpi(String xhdpi) {
            this.xhdpi = xhdpi;
        }
    }
}
公共类DensityDeserializer扩展JsonDeserializer{
公共最终静态int LDPI=0;
公共最终静态int MDPI=1;
公共最终静态int HDPI=2;
公共最终静态int XHDPI=3;
私有int mDensity=LDPI;
公共密度反序列化器(){
}
公共密度反序列化器(int-density){
密度=密度;
}
@凌驾
公共字符串反序列化(JsonParser JsonParser,
反序列化上下文(反序列化上下文)引发IOException,
JsonProcessingException{
ScreenContainer ScreenContainer=jsonparser
.readValueAs(ScreenContainer.class);
开关(密度){
违约:
返回“”;
案例LDPI:
返回screenContainer.getLdpi();
案例MDPI:
返回screenContainer.getHdpi();
案例HDPI:
返回screenContainer.getHdpi();
案例XHDPI:
返回screenContainer.getXhdpi();
}
}
公共静态类屏蔽容器{
公共字符串ldpi=“”;
公共字符串mdpi=“”;
公共字符串hdpi=“”;
公共字符串xhdpi=“”;
公共屏幕容器(){
//TODO自动生成的构造函数存根
}
公共字符串getLdpi(){
返回ldpi;
}
公共无效设置ldpi(字符串ldpi){
this.ldpi=ldpi;
}
公共字符串getMdpi(){
返回mdpi;
}
公共void setMdpi(字符串mdpi){
this.mdpi=mdpi;
}
公共字符串getHdpi(){
返回hdpi;
}
公共void setHdpi(字符串hdpi){
this.hdpi=hdpi;
}
公共字符串getXhdpi(){
返回xhdpi;
}
公共void setXhdpi(字符串xhdpi){
this.xhdpi=xhdpi;
}
}
}
当我运行程序时,它会抛出一个异常:

01-11 12:29:06.833:W/System.err(1501):com.fasterxml.jackson.databind.JsonMappingException:无法从JSON字符串实例化[simple type,class.DensityDeserializer$ScreenCainer]类型的值;没有单字符串构造函数/工厂方法(通过引用链:E.[屏幕])


有什么建议吗?

您传递给映射器的实际JSON是什么?因为您在问题中显示的JSON实际上会导致您的错误(顶层对象周围没有外部大括号)。我认为这很好-它像[{“id”:“1”,…,“screen”:{“ldpi”:“1.jpg”,“mdpi”:“2.jpg”,“hdpi”:“3.jpg”,“xhdpi”:“4.jpg”},},{……},},{……}],JSON表示一个对象数组。在这些对象中,每个对象都嵌入了屏幕属性。这显然不适用于您显示的代码。它在屏幕字段还没有被引入之前就已经反序列化了。现在我有了`@JsonDeserialize(使用=DensityDeserializer.class)@JsonProperty(“screen”)私有字符串screenImageUrl;`有什么建议吗?