首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >由构造函数引起的Jackson - JsonMappingException

由构造函数引起的Jackson - JsonMappingException
EN

Stack Overflow用户
提问于 2012-10-11 17:01:24
回答 5查看 94.7K关注 0票数 28

在尝试反序列化JSON时,我遇到了以下异常

找不到适合类型的构造函数[simple type, class MyObj$obj$Card]:无法从JSON对象实例化(需要添加/启用类型信息?)在[Source: java.io.StringReader@4344ee21; line: 1, column: 201] (通过参考链:MyObj["obj"]->Obj["cards"])

而JSON是

代码语言:javascript
复制
{
  "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类。

代码语言:javascript
复制
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(); }
}
EN

回答 5

Stack Overflow用户

发布于 2012-10-11 17:17:50

我认为问题很可能与卡片对象有关

  • 它可能没有默认构造函数它没有默认构造函数,应该使用

对其进行批注

编辑我有两样东西:

*你没有setter。

*你没有被允许设置你的文件的公共构造函数。

如果没有为反序列化程序提供任何(合法*)方法,那么反序列化器应该如何填充字段?

解决方案:

->将公共setter添加到类中

->或创建带有@JsonCreator注解的参数化构造函数

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

EDIT2我认为这应该是可行的,但我不能测试它--我手头上没有一个与Jackson一起正确设置的项目(这只是其中的一部分,但我认为它很容易解释我想要展示的东西)。请注意,我将数组更改为列表:

代码语言:javascript
复制
    @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); }     
}     
票数 45
EN

Stack Overflow用户

发布于 2014-08-15 00:30:45

前几天我出现了同样的症状,并听取了有关JsonCreatorJsonProperty的建议,但我得到了完全相同的错误消息。事实证明,我正在进行的项目使用的是fasterxml和codehaus版本的jackson。我将codehaus属性放在我的类中,但使用了fasterxml的ObjectMapper来进行解析。他们享受传递依赖的乐趣。

票数 11
EN

Stack Overflow用户

发布于 2012-10-11 17:15:22

我认为您的某个类中缺少默认构造函数。

或者:向构造函数添加@JsonCreator注释

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12835911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档