java - jsonproperty用法 - jsonproperty详解




JsonMappingException:找不到类型为[简单类型,类]的合适构造函数:无法从JSON对象实例化 (7)

拇指规则 :为您用作映射类的每个类添加默认构造函数。 你错过了这个问题出现了!
只需添加默认构造函数,它应该可以工作。

尝试获取JSON请求并处理时,出现以下错误:

org.codehaus.jackson.map.JsonMappingException:找不到类型为[简单类型,类com.myweb.ApplesDO]的合适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?)

这是我试图发送的JSON:

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

在控制器中,我有以下方法签名:

@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
    }
}

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

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


你可以请测试这个结构。 如果我没有记错,你可以这样使用它:

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

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


发生这种情况的原因如下:

  1. 你的内部类应该被定义为静态的

    private static class Condition {  //jackson specific    
    }
    
  2. 这可能是你的类没有默认的构造函数( 更新:这似乎不是这种情况)

    private static class Condition {
        private Long id;
    
        public Condition() {
        }
    
        // Setters and Getters
    }
    
  3. 这可能是你的安装人员没有正确定义或不可见(例如私人安装人员)


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

注意,我的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;
       }        
    }

当我遇到这个问题时,这是尝试使用内部类作为DO的结果。 内部类的构造(默默地)需要一个封闭类的实例 - 这对杰克逊是不可用的。

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


您必须在模型类中创建虚拟空构造函数。因此,在映射json时,它通过setter方法进行设置。


所以,最后我意识到了问题所在。 我怀疑这不是杰克逊的配置问题。

其实这个问题出现在ApplesDO类中:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

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

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

为类定义了一个自定义构造函数,使其成为默认的构造函数。 介绍一个虚拟构造函数使错误消失:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

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

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

    //Introducing the dummy constructor
    public ApplesDO() {
    }

}




jackson