Jackson - JsonMappingException由于构造函数

Mr.*_*Mr. 27 java json jackson gson

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

找到的类型没有合适的构造[simple type, class MyObj$obj$Card]:不能从JSON对象实例化(需要添加/启用类型信息吗?)在[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
           }
        ]
     }
 ]
 }
}
Run Code Online (Sandbox Code Playgroud)

Obj课堂上我有以下声明

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

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

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

UPDATE

我已经包含了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(); }
}
Run Code Online (Sandbox Code Playgroud)

ppe*_*rka 41

我认为这个问题很可能与Card对象有关

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

编辑 我有两件事:
*你没有制定者.
*您没有可以设置文件的公共构造函数.

如果你没有给它任何(合法*)手段,反序列化器应该如何填充你的字段?

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

*:当然,解析器可以做反射性的"mofidy the visibility"技巧,但是来吧,这不是"它的意思是"

EDIT2 我认为这应该有用,但我无法测试它 - 我现在没有杰克逊正确设置的项目(这只是它的一部分,但我认为很容易解释我想要的显示.)注意,我将数组更改为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); }     
}     
Run Code Online (Sandbox Code Playgroud)


Tim*_*art 9

我前几天有同样的症状并接受了建议JsonCreator,JsonProperty但我收到了同样的错误信息.事实证明,我正在研究的项目是使用quickxml和codehaus版本的jackson.我将codehaus属性放在我的类上,但使用了quickxml的ObjectMapper来进行解析.他们喜欢传递依赖.


Rat*_*ker 6

我一直面临同样的问题.我的Json数据集如下

{
"count": 1917,
  "data": [
    {
      "id": "1",
      "generated_id": "Z1-1156",
      "first_name": "Maruf",
      "last_name": "Ahmed",
      "full_name": "Mr. Maruf Ahmed",
      "email": "maruf1990@gmail.com",
      "phone": "+8801676798306",
      "company_name": "S M Style Ltd.",
      "website": "http:\\/\\/smartex-bd.com\\/",
      "address": "\\\nRoad No:5 House No:18\\\nLevel:3\\\nLane:\\\nBlock:F\\\nSector:2\\\nArea:Mirpur\\\nDhaka 1216\\\nMirpur\\\nBangladesh",
      "industry_type": "Apparel Retailer",
      "job_title": "Designer",
      "department": "Research & Development",
      "date": "7\\/10\\/2015 1:04:43 PM"
    },
    {
      "id": "2",
      "generated_id": "Z2-1157",
      "first_name": "Akramul",
      "last_name": "Hoque",
      "full_name": "Mr. Akramul Hoque",
      "email": "akram@nassagroup.org",
      "phone": "+8801732005564",
      "company_name": "Nassa Group",
      "website": "www,nassagroup.org",
      "address": "Nassa Group\\\nRoad No:238 House No:\\\nLevel:\\\nLane:\\\nBlock:\\\nSector:\\\nArea:Gulshan li\\\nDhaka 1208\\\nTejgaon Industrial Area\\\nBangladesh",
      "industry_type": "Denim Garments Manufacturer",
      "job_title": "Merchandiser (Senior)",
      "department": "Merchandising",
      "date": "7\\/9\\/2015 10:56:22 PM"
    }
    ]
}
        @JsonIgnoreProperties(ignoreUnknown = true)
    public class Visitors {



      @JsonIgnoreProperties(ignoreUnknown = true)
      public static class Visitor{
        @JsonProperty("id")
        public String mId;

        @JsonProperty("generated_id")
        public String mGenId;

        @JsonProperty("first_name")
        public String mFirstName;

        @JsonProperty("last_name")
        public String mLastName;

        @JsonProperty("full_name")
        public String mFullName;

        @JsonProperty("email")
        public String mEmail;

        @JsonProperty("phone")
        public String mPhone;

        @JsonProperty("company_name")
        public String mCompanyName;

        @JsonProperty("website")
        public String mWebsite;

        @JsonProperty("address")
        public String mAdress;

        @JsonProperty("industry_type")
        public String mIndustryType;

        @JsonProperty("job_title")
        public String mJobtitle;

        @JsonProperty("department")
        public String mDepartment;

        @JsonProperty("date")
        public String mDate;


        public Visitor(@JsonProperty("id") String  Id,
                       @JsonProperty("generated_id") String  GenId,
                       @JsonProperty("first_name") String  FirstName,
                       @JsonProperty("last_name") String  LastName,
                       @JsonProperty("full_name") String  FullName,
                       @JsonProperty("email") String  Email,
                       @JsonProperty("phone") String  Phone,
                       @JsonProperty("company_name") String  CompanyName,
                       @JsonProperty("website") String  Website,
                       @JsonProperty("address") String  Adress,
                       @JsonProperty("industry_type") String  IndustryType,
                       @JsonProperty("job_title") String  Jobtitle,
                       @JsonProperty("department") String  Department,
                       @JsonProperty("date") String  date)
        {
          mId = Id;
          mGenId = GenId;
          mFirstName = FirstName;
          mLastName= LastName;
          mFullName= FullName;
          mEmail= Email;
          mPhone= Phone;
          mCompanyName= CompanyName;
          mWebsite= Website;
          mAdress= Adress;
          mIndustryType= IndustryType;
          mJobtitle= Jobtitle;
          mDepartment= Department;
          mDate= date;
        }
      }


      @JsonProperty("count") public String mCount;


      @JsonProperty("data")  public ArrayList<Visitor> mVisitorList;

      @JsonCreator
      public Visitors(  @JsonProperty("count") String Count,
                        @JsonProperty("data") ArrayList<Visitor> visitorList)
      {
        mCount = Count;
        mVisitorList = visitorList;
      }
    }
Run Code Online (Sandbox Code Playgroud)

问题是内部类声明,它应该是静态的.因为杰克逊需要像访问它一样

new Visitors.Visitor();
Run Code Online (Sandbox Code Playgroud)

所以我宣称内部Visitor阶级为static.它对我有用.

  • 需要静态的内部类解决了我的问题.不需要@JsonCreator. (2认同)

uri*_*rir 3

我认为您在其中一个类中缺少默认构造函数。
或者:将 @JsonCreator 注解添加到构造函数中