我得到以下错误时,试图获得一个JSON请求和处理它:

jsonmappingexception:没有为类型[简单类型,类com.myweb.]找到合适的构造函数。ApplesDO]:不能从JSON对象实例化(需要添加/启用类型信息?)

这是我试图发送的JSON:

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}

在Controller中,我有以下方法签名:

@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}

AllApplesDO是ApplesDO的包装器:

public class AllApplesDO {

    private List<ApplesDO> applesDO;

    public List<ApplesDO> getApplesDO() {
        return applesDO;
    }

    public void setApplesDO(List<ApplesDO> applesDO) {
        this.applesDO = applesDO;
    }
}

ApplesDO:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String appl) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom){
        //constructor Code
    }
}

我认为Jackson无法将JSON转换为子类的Java对象。请帮助Jackson将JSON转换为Java对象的配置参数。我正在使用Spring框架。

编辑:在上面的示例类中包含了导致此问题的主要错误-请查看解决方案的接受答案。


当前回答

出现这种情况的原因如下:

内部类应该定义为静态的 私有静态类条件{//jackson特定 } 可能是类中没有默认构造函数(UPDATE:似乎不是这样) 私有静态类 private Long id; 公共条件(){ } // Setters和Getters } 它可能是你的setter没有正确定义或不可见(例如私有setter)

其他回答

如果开始注释构造函数,则必须注释所有字段。

注意,我的Staff.name字段映射到JSON字符串中的“ANOTHER_NAME”。

     String jsonInString="{\"ANOTHER_NAME\":\"John\",\"age\":\"17\"}";
     ObjectMapper mapper = new ObjectMapper();
     Staff obj = mapper.readValue(jsonInString, Staff.class);
     // print to screen

     public static class Staff {
       public String name;
       public Integer age;
       public Staff() {         
       }        

       //@JsonCreator - don't need this
       public Staff(@JsonProperty("ANOTHER_NAME") String   n,@JsonProperty("age") Integer a) {
        name=n;age=a;
       }        
    }

经验法则:为每个用作映射类的类添加默认构造函数。你错过了这个问题出现了! 只需添加默认构造函数,它就应该工作。

你能测试一下这个结构吗?如果我没记错的话,你可以这样用:

{
    "applesRequest": {
        "applesDO": [
            {
                "apple": "Green Apple"
            },
            {
                "apple": "Red Apple"
            }
        ]
    }
}

其次,请为每个类添加默认构造函数,这也可能有所帮助。

当我遇到这个问题时,这是试图使用内部类作为DO的结果。内部类的构造(静默地)需要一个外围类的实例——Jackson无法使用这个实例。

在这种情况下,将内部类移动到它自己的.java文件中解决了这个问题。

您必须了解Jackson有哪些反序列化选项。在Java中,方法参数名不会出现在编译后的代码中。这就是为什么Jackson通常不能使用构造函数来创建一个定义良好的对象。

如果有一个空构造函数,同时也有setter,它使用空构造函数和setter。如果没有设置,则使用一些黑魔法(反射)来做到这一点。

如果希望在Jackson中使用构造函数,则必须使用@PiersyP在他的回答中提到的注释。您还可以使用构建器模式。如果遇到一些例外,祝你好运。Jackson中的错误处理非常糟糕,很难理解错误消息中的胡言乱语。