jackson – 由于构造函数导致的JsonMappingException

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

没有为类型[simple type, class MyObj$obj$Card]:找到合适的构造函数[simple type, class MyObj$obj$Card]:无法在[Source: java.io.StringReader@4344ee21; line: 1, column: 201]来自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 } ] } ] } } 

Obj课程中,我有以下声明

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

这产生了上述例外。 将Card[]类型更改为Object[]不会产生exception,但它缺少我想要的正确映射。

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

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

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

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

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

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

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

*:当然,解析器可以做reflection“mofidy the visibility”技巧,但是来吧,这不是“它的意思是”

EDIT2我认为这应该有用 ,但是我无法测试它 – 我现在没有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 items; @JsonCreator public Card(@JsonProperty("items") List items) { this.items = items; } public final List getItems() { return items; } public final String toString() { return new Gson().toJson(this); } } 

我前几天有同样的症状并接受了有关JsonCreatorJsonProperty的建议,但我得到了同样的确切错误消息。 事实certificate,我正在研究的项目是使用quickxml和codehaus版本的jackson。 我将codehaus属性放在我的类上,但使用了quickxml的ObjectMapper来进行解析。 他们喜欢传递依赖。

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

 {
 “伯爵”:1917年,
   “数据”:[
     {
       “id”:“1”,
       “generated_id”:“Z1-1156”,
       “first_name”:“Maruf”,
       “last_name”:“艾哈迈德”,
       “full_name”:“Maruf Ahmed先生”,
       “email”:“maruf1990@gmail.com”,
       “电话”:“+ 8801676798306”,
       “company_name”:“SM Style Ltd.”,
       “网站”:“http:\\ / \\ / smartex-bd.com \\ /”,
       “地址”:“\\\ nRoad No:5 House No:18 \\\ nLevel:3 \\\ nLane:\\\ nBlock:F \\\ nSector:2 \\\ nArea:Mirpur \\\ nDhaka 1216 \\\ nMirpur \\\ nBangladesh”
       “industry_type”:“服装零售商”,
       “job_title”:“设计师”,
       “部门”:“研究与发展”,
       “date”:“7 \\ / 10 \\ / 2015 1:04:43 PM”
     },
     {
       “id”:“2”,
       “generated_id”:“Z2-1157”,
       “first_name”:“Akramul”,
       “last_name”:“Hoque”,
       “full_name”:“Akramul Hoque先生”,
       “email”:“akram@nassagroup.org”,
       “电话”:“+ 8801732005564”,
       “company_name”:“Nassa集团”,
       “网站”:“www,nassagroup.org”,
       “地址”:“Nassa Group \\\ nRoad No:238 House No:\\\ nLevel:\\\ nLane:\\\ nBlock:\\\ nSector:\\\ nArea:Gulshan li \\\ nDhaka 1208 \ \\ n孟加拉国工业区\ n,
       “industry_type”:“牛仔服装制造商”,
       “job_title”:“跟单员(高级)”,
       “部门”:“推销”,
       “日期”:“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 mVisitorList; @JsonCreator public Visitors( @JsonProperty("count") String Count, @JsonProperty("data") ArrayList visitorList) { mCount = Count; mVisitorList = visitorList; } } 

问题是内部类声明,它应该是静态的。 因为jackson需要像访问它一样

 new Visitors.Visitor(); 

所以我将内部Visitor类声明为static 。 它对我有用。

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

查看您的Card类 – 很可能没有可访问的默认构造函数或构造函数缺少正确的映射。