我得到了来自第三方服务提供者的JSON响应,它有一个对象数组。 当我试图使用杰克逊api的反序列化JSON。我得到以下异常使用Jackson反序列化JSON数组使用Jackson
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of JacksonFields out of START_ARRAY token
at [Source: [email protected]; line: 5, column: 26]
我的JSON响应
{
"flags" : 1074200577,
"results" : {
"id1" : 0,
"id2" : 0,
"fields" : [
{
"id1" : 19202,
"id2" : 19202,
"count" : 0,
"format" : 8,
"type" : "name",
"flags" : 0,
"group" : 1074,
"value" : "1074"
},
{
"id1" : 19218,
"id2" : 19218,
"count" : 0,
"format" : 8,
"type" : "name",
"flags" : 0,
"group" : 1075,
"value" : "1075"
}
]
}
}
我的POJO类看起来像这样
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class JacksonFields {
int id1;
int id2;
int count;
int format;
String type;
int flags;
int group;
String value;
public JacksonFields(){
}
@JsonCreator
public JacksonFields(@JsonProperty("id1") int id1,
@JsonProperty("id2") int id2,
@JsonProperty("count") int count,
@JsonProperty("format") int format,
@JsonProperty("type") String type,
@JsonProperty("flags") int flags,
@JsonProperty("group") int group,
@JsonProperty("value") String value){
this.id1 = id1;
this.id2 = id2;
this.count = count;
this.format = format;
this.type = type;
this.flags = flags;
this.group = group;
this.value = value;
}
public void putId1(int id){
this.id1=id;
}
public void putId2(int id){
this.id2=id;
}
public void putCount(int count){
this.count=count;
}
public void putFormat(int format){
this.format=format;
}
public void putType(String type){
this.type=type;
}
public void putFlag(int flag){
this.flags=flag;
}
public void putGroup(int group){
this.group=group;
}
public void putValue(String val){
this.value=val;
}
}
class JacksonResults {
int id1;
int id2;
JacksonFields fields;
@JsonCreator
public JacksonResults(@JsonProperty("id1") int id1,
@JsonProperty("id2") int id2,
@JsonProperty("fields") JacksonFields fields){
this.id1 = id1;
this.id2 = id2;
this.fields = fields;
}
public JacksonResults(){
}
public void putId1(@JsonProperty("id1") int id){
this.id1 = id;
}
public void putId2(@JsonProperty("id2") int id){
this.id2 = id;
}
public void putFields(@JsonProperty("fields") JacksonFields fie){
this.fields = fie;
}
}
public class JacksonJsonObj{
Long flags;
JacksonResults res;
@JsonCreator
public JacksonJsonObj(@JsonProperty("flags") long flags,
@JsonProperty("results") JacksonResults res){
this.flags = flags;
this.res = res;
}
public JacksonJsonObj(){
}
public void putFlags(@JsonProperty("flags") long flag){
this.flags = flag;
}
public void putResults(@JsonProperty("results") JacksonResults res){
this.res=res;
}
}
我试图用反序列化JSON下面的代码
ObjectMapper objmapper = new ObjectMapper();
objmapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JacksonJsonObj jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj.class);
如果我试试要做
JacksonJsonObj[] jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj[].class);
它在BEGIN_OBJECT本身失败。如何读取和反序列化与数组的JSON。我应该写我自己的解串器吗?
编辑 如果我工作在JSON字符串而不是流我能够得到所有Java对象回来。但有更好的表现,我想杰克逊投产
替代方法
List<JsonFields> JsonFieldsJackson = new ArrayList<JsonFields>();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode nodes = mapper.readTree(strbuffer.toString());
nodes.elements();
Iterator<JsonNode> iter = nodes.path("results").path("fields").elements();
while(iter.hasNext()){
JsonNode node = iter.next();
JsonFields fie = mapper.readValue(node.toString(),JsonFields.class);
JsonFieldsJackson.add(fie);
}