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;`有什么建议吗?