2013-04-23 106 views
0

我得到了来自第三方服务提供者的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); 
} 

回答

0

反序列化JSON的工作,你应该有3类像

class Field{ 
int id1; 
int id2; 
int count; 
int format; 
String type; 
int flags; 
int group; 
String value; 

} 
class Result{ 
int id1; 
int id2; 
Field[] fields; 
} 

class JacksonFields { 
String flags; 
Result result; 

} 

然后你就可以像

编写代码
JacksonFields jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonFields.class); 

然后它会工作。 注意: - 我没有提供适当的注释给你可以提供的类。

1

我考虑到你已经有2瓶即 1.杰克逊核心 2.杰克逊映射

所以从JSON解析到你的POJO

ObjectMapper mapper = new ObjectMapper(); 
    JavaType javaType=mapper.getTypeFactory().constructType(JacksonFields.class); 

    JacksonFields jksnflds = mapper.readValue(jsonString,javaType); 

和完蛋了!

相关问题