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); } }
我前几天有同样的症状并接受了有关JsonCreator
和JsonProperty
的建议,但我得到了同样的确切错误消息。 事实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类 – 很可能没有可访问的默认构造函数或构造函数缺少正确的映射。