[英]nested json parsing for android with jackson
我剛開始使用android程序編程,並使用imdb api找到了很好的教程。 而不是在本教程中使用xml我想使用json和接收的json我有一個問題。 這是person.json:
[
{
"score":1,
"popularity":3,
"name":"Brad Pitt",
"id":287,
"biography":"test",
"url":"http://www.themoviedb.org/person/287",
"profile":[
{
"image":{
"type":"profile",
"size":"thumb",
"height":68,
"width":45,
"url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w45/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
"id":"4ea5cb8c2c0588394800006f"
}
},
{
"image":{
"type":"profile",
"size":"profile",
"height":281,
"width":185,
"url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/w185/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
"id":"4ea5cb8c2c0588394800006f"
}
},
{
"image":{
"type":"profile",
"size":"h632",
"height":632,
"width":416,
"url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/h632/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
"id":"4ea5cb8c2c0588394800006f"
}
},
{
"image":{
"type":"profile",
"size":"original",
"height":1969,
"width":1295,
"url":"http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original/w8zJQuN7tzlm6FY9mfGKihxp3Cb.jpg",
"id":"4ea5cb8c2c0588394800006f"
}
}
],
"version":685,
"last_modified_at":"2013-02-16 07:11:15 UTC"
}
]
我的兩個對象:
public class Person implements Serializable {
private static final long serialVersionUID = 6794898677027141412L;
public String score;
public String popularity;
public String name;
public String id;
public String biography;
public String url;
public String version;
public String lastModifiedAt;
public Profile profile;
}
public class Profile implements Serializable {
private static final long serialVersionUID = -8735669377345509929L;
public ArrayList<Image> imagesList;
}
public class Image implements Serializable {
private static final long serialVersionUID = -2428562977284114465L;
public String type;
public String url;
public String size;
public int width;
public int height;
}
我無法弄清楚如何使用傑克遜對象映射器檢索人員列表。 當我使用這個:
ObjectMapper mapper = new ObjectMapper();
Person person= mapper.readValue(jsonResponseString, Person.class);
我有:
02-16 18:34:48.010:W / System.err(376):com.fasterxml.jackson.databind.JsonMappingException:無法從START_ARRAY標記02-16 18反序列化com.example.imdbsearcher.model.Person的實例:34:48.180:W / System.err(376):at [來源:java.io.StringReader@40a81778; line:1,column:1] 02-16 18:34:48.554:W / System.err(376):at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599)02-16 18: 34:48.830:W / System.err(376):at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:593)
我已經用Keith和crdnilfan的建議改變了檢索方法。 但現在我的配置文件屬性有問題。
我意識到我錯過了一個人對象,基本上我創建了新的配置文件對象並將imageList移動到這個類。
我已經更新了POJO,如上所述。
但現在我得到的配置文件錯誤相同。
無法從START_ARRAY令牌中反序列化com.example.imdbsearcher.model.Profile的實例
那是因為你試圖反序列化Person.class列表,而不是一個實例。 創建這樣的另一個類
public class PersonList extends ArrayList<Person> {}
然后使用
ArrayList<Person> people = mapper.readValue(jsonResponseString, PersonList.class);
您需要反序列化列表,因為您的JSON是一個數組:
List<Person> people = mapper.readValue(
jsonResponseString, new TypeReference<List<Person >>(){});
但是,執行此操作后,由於JSON中的配置文件屬性,您將有一些額外的反序列化錯誤。 結帳: http : //jackson.codehaus.org/1.5.7/javadoc/org/codehaus/jackson/annotate/JsonIgnoreProperties.html
更新:
public class Person implements Serializable
{
public List<Object> profile;
public String score;
public String popularity;
public String name;
public String id;
public String biography;
public String url;
public String version;
public String last_modified_at;
}
有幾種方法可以解決這個問題。 這將為您提供Profile的鏈接哈希映射。
或者,如果您控制JSON格式,請將配置文件語法更改為:
"profile":[
image:...,
image:...
]
另外兩個答案清楚地解釋了錯誤的原因,它將擺脫錯誤,它將解析Person對象。 但對我來說,它無法解析圖像對象。 使用下面的POJO,我們可以完全解析指定的json,即使沒有任何問題也沒有任何問題
@JsonIgnoreProperties
or
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
POJO定義:
public class PersonList extends ArrayList<Person> {}
public class Person implements Serializable {
private static final long serialVersionUID = 6794898677027141412L;
public String score;
public String popularity;
public String name;
public String id;
public String biography;
public String url;
public String version;
@JsonProperty(value="last_modified_at")
public String lastModifiedAt;
public List<Profile> profile;
}
public class Profile implements Serializable {
private static final long serialVersionUID = -8735669377345509929L;
@JsonProperty(value="image")
public Image imagesList;
}
public class Image implements Serializable {
private static final long serialVersionUID = -2428562977284114465L;
public String id;
public String type;
public String url;
public String size;
public int width;
public int height;
}
這應該解析json
String jsonResponseString = readJsonFile("person.json");
ObjectMapper mapper = new ObjectMapper();
PersonList person= mapper.readValue(jsonResponseString, PersonList.class);
or
List<Person> person= mapper.readValue(jsonResponseString,
new TypeReference<List< Person>>(){}); //if we use this we dont have to define PersonList class
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.