jakson - JsonMappingException由于构造函数引起的异常如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

尝试反序列化JSON时出现以下异常

No suitable constructor found for type[simple type, class MyObj$obj$Card]:can not instantiate from JSON object (need to add/enable type information?) at[Source: java.io.StringReader@4344ee21; line: 1, column: 201](through reference chain:MyObj["obj"]->Obj["cards"])

而JSON是

{
  "obj":{
  "api":"OK",
  "cache":false,
  "cards":[
     {
        "id":1232995897,
        "items":[
           {
              "id":"vmdSJLpnY",
              "cat":50,
              "rating":0.0
           }
        ]
     },
     {
        "id":0005897,
        "items":[
           {
              "id":"vxdSJLpnY",
              "cat":50,
              "rating":0.0
           }
        ]
     }
 ]
 }
}

Obj类上,我有以下陈述

@JsonProperty("cards") private Card[] cards;

这产生了上述例外。更改类型Card[],以Object[]不产生异常,但缺乏正确的映射我渴望得到的。

任何线索我如何解决它?一个片段将是伟大的!无论如何这个错误意味着什么?

我已经包含了Java类。

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.Gson;

@JsonIgnoreProperties(ignoreUnknown=true)
public final class MyObj {
    @JsonIgnoreProperties(ignoreUnknown=true)
    public final class Obj {
        @JsonIgnoreProperties(ignoreUnknown=true)
        public final class Card {
            @JsonIgnoreProperties(ignoreUnknown=true)
            public final class Item {
                @JsonProperty("id") private String id;
                @JsonProperty("cat") private String cat;
                @JsonProperty("rating") private String rating;
                public final String getId() { return id; }
                public final String getCat() { return cat; }
                public final String getRating() { return ranting; }
                public final String toString() { return new Gson().toJson(this); }
            }

            @JsonProperty("items") private Item[] items;
            public final Item[] getItems() { return items; }
            public final String toString() { return new Gson().toJson(this); }
        }

        @JsonProperty("cards") private Card[] cards;
        public Card[] getCards() { return cards; }
        public final String toString() { return new Gson().toJson(this); }      
    }


    @JsonProperty("obj") MyObj obj;
    public final Card[] getCards(){ return apiServiceResultsNoLists.getCards(); }
}
提问于
用户回答回答于

有一天我有同样的症状,并采取了有关建议JsonCreatorJsonProperty但我得到了同样的确切的错误消息。事实证明,我正在开发的项目是使用更快的xml和codehaus版本的jackson。我将codehaus属性放在我的类上,但使用fasterxml的ObjectMapper进行解析。他们对传递性依赖的喜悦。

用户回答回答于

我认为问题很可能是Card对象

  • 它可能没有默认的构造函数
  • 如果它没有默认的构造函数,它应该用注释@JsonCreator

我有两件事情: *没有setter方法。 *没有可以设置您的档案的公共构造函数。

如果你没有给它提供任何(法律*)的意义,反序列化器应该如何填充你的字段?

解决方案: - >将公共setter添加到类 - >或创建带@JsonCreator注释的参数化构造函数

*:当然,解析器可以做到反射式的“mofidy the visibility”技巧,但是,这并不是“它的意图被播放的方式”

我认为这应该可行,但我无法测试它 - 我现在没有与jackson正确设置的项目在一起(这只是其中的一部分,但我认为很容易解释我想要的东西)注意,我将数组更改为List:

    @JsonIgnoreProperties(ignoreUnknown=true)     
public final class Card {     
    @JsonIgnoreProperties(ignoreUnknown=true)

    public final class Item {     
        @JsonProperty("id") private String id;     
        @JsonProperty("cat") private String cat;     
        @JsonProperty("rating") private String rating;     

        @JsonCreator
        public Item(@JsonProperty("id") String id, @JsonProperty("cat") String cat, @JsonProperty("rating") String rating) {
            this.id = id;
            this.cat = cat;
            this.rating = rating;
        }   


        public final String getId() { return id; }     
        public final String getCat() { return cat; }     
        public final String getRating() { return ranting; }     
        public final String toString() { return new Gson().toJson(this); }     
    }     
    @JsonProperty("items") private List<Item> items;     

    @JsonCreator
    public Card(@JsonProperty("items") List<Item> items) {
        this.items = items;
    }       

    public final List<Item> getItems() { return items; }     

    public final String toString() { return new Gson().toJson(this); }     
}     

扫码关注云+社区