Reputation: 192
i am new on JSON and have a problem on creating POJO for followed JSON input.
[
{
"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"
}
]
i have created three POJO's for this one of them is main person class and this one contains profile object also. Profile object returns image list.:
public class Person implements Serializable {
private static final long serialVersionUID = 6794898677027141412L;
public String biography;
public String id;
public String last_modified_at;
public String name;
public String popularity;
public String score;
public String url;
public String version;
public ArrayList<Profile> profile;
//getters and setters
}
public class Profile implements Serializable {
private static final long serialVersionUID = -6482559829789740926L;
public ArrayList<Image> image;
}
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;
}
to retrieve data i am using gson:
Gson gson = new Gson();
Type collectionType = new TypeToken<List<Person>>(){}.getType();
List<Person> details = gson.fromJson(json, collectionType);
when i run this i got:
02-17 11:04:50.531: E/AndroidRuntime(405): Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 3
updated Image POJO:
public class Image implements Serializable {
private static final long serialVersionUID = -2428562977284114465L;
private Object image;
public class ImageInner {
public static final String SIZE_ORIGINAL = "original";
public static final String SIZE_MID = "mid";
public static final String SIZE_COVER = "cover";
public static final String SIZE_THUMB = "thumb";
public static final String TYPE_PROFILE = "profile";
public static final String TYPE_POSTER = "poster";
public String type;
public String url;
public String size;
public int width;
public int height;
}
}
thank you
Upvotes: 2
Views: 2020
Reputation: 76898
Your code is actually really close, with two errors:
1) The error you're receiving is telling you that at the very beginning of the JSON it was expecting the start of an array ([
) , but got the start of an object ({
) instead. The JSON you have posted is not what you're feeding Gson (see below).
2) When you correct the above, you have one small problem in your Person
POJO:
public ArrayList<Profile> profile;
should be:
public ArrayList<Image> profile;
You actually don't need your Profile
class; profile
in the JSON is an array. As-is you would receive another error similar to what you're receiving now because it would be expecting an ArrayList of Profile
objects: "profile":[{"image":[{imageobject},...]},{"image":[{imageobject},...]}]
If you fix number two and feed Gson the JSON you have posted, it works perfectly. You've posted an array of Person
objects but what you actually have in your code (in json
) is either just one object ... or an object that contains the array you have posted. The small example below works perfectly (after correcting your Person
class):
public class App
{
static String 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 static void main(String[] args)
{
Gson gson = new Gson();
Type collectionType = new TypeToken<List<Person>>(){}.getType();
List<Person> details = gson.fromJson(json, collectionType);
}
}
Edit to add: You actually have some type conversions going on that Gson is handling for you ... but you may not really want. For example in your JSON score
is an int
but in your POJO you've made it a String
. Gson silently does the conversion.
Also, simply creating a SSCCE (http://sscce.org/) like what I did above can help you debug these issues.
Upvotes: 1