在尝试反序列化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
}
]
}
]
}
}
在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(); }
}
发布于 2012-10-11 17:17:50
我认为问题很可能与卡片对象有关
对其进行批注
编辑我有两样东西:
*你没有setter。
*你没有被允许设置你的文件的公共构造函数。
如果没有为反序列化程序提供任何(合法*)方法,那么反序列化器应该如何填充字段?
解决方案:
->将公共setter添加到类中
->或创建带有@JsonCreator注解的参数化构造函数
*:当然,解析器可以做反射的"mofidy the visibility“技巧,但是,这不是”它应该被播放的方式“
EDIT2我认为这应该是可行的,但我不能测试它--我手头上没有一个与Jackson一起正确设置的项目(这只是其中的一部分,但我认为它很容易解释我想要展示的东西)。请注意,我将数组更改为列表:
@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); }
}
发布于 2014-08-15 00:30:45
前几天我出现了同样的症状,并听取了有关JsonCreator
和JsonProperty
的建议,但我得到了完全相同的错误消息。事实证明,我正在进行的项目使用的是fasterxml和codehaus版本的jackson。我将codehaus属性放在我的类中,但使用了fasterxml的ObjectMapper来进行解析。他们享受传递依赖的乐趣。
发布于 2012-10-11 17:15:22
我认为您的某个类中缺少默认构造函数。
或者:向构造函数添加@JsonCreator注释
https://stackoverflow.com/questions/12835911
复制相似问题