Jackson - JsonMappingException 由于构造函数

2022-09-01 12:39:48

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

没有为类型找到合适的构造函数,无法从 JSON 对象实例化(需要添加/启用类型信息?)在(通过引用链:[simple type, class MyObj$obj$Card]:[Source: java.io.StringReader@4344ee21; line: 1, column: 201]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(); }
}

答案 1

我认为问题最有可能与对象有关

  • 它可能没有默认构造函数
  • 如果它没有默认构造函数,则应使用@JsonCreator

编辑我有两件事:
*你没有二传手。
*您没有允许设置您的文件的公共构造函数。

如果您不为其提供任何(合法*)手段,反序列化程序应如何填充您的字段?

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

*:当然,解析器可以做反射式的“mofidy the visibility”技巧,但来吧,这不是“它注定要玩的方式”

编辑2我认为这应该有效,但我无法测试它 - 我现在手头没有一个项目,杰克逊现在已经正确设置好了(这只是其中的一部分,但我认为很容易解释我想展示的内容。注意,我将数组更改为列表:

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

答案 2

前几天我有同样的症状,并接受了关于的建议,但我得到了相同的确切错误消息。事实证明,我正在做的项目使用的是 fasterxml 和 codehaus 的 jackson 版本。我把codehaus属性放在我的类上,但使用fasterxml的ObjectMapper来进行解析。他们以传递依赖为乐。JsonCreatorJsonProperty