2013-02-17 4 views
2

Я новичок в JSON и имею проблему при создании POJO для входа JSON.POJO для вложенных 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" 
    } 
    ] 

я создал три POJO для этого один из них является основным классом человек, и это один содержит профиль объекта также. Профиль объекта возвращает список изображений .:

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; 
    } 

для извлечения данных я использую gson:

Gson gson = new Gson(); 
    Type collectionType = new TypeToken<List<Person>>(){}.getType(); 
    List<Person> details = gson.fromJson(json, collectionType); 

, когда я запускаю это я получил:

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 

обновленный POJO Image:

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; 

} 
} 

спасибо

ответ

1

Ваш код на самом деле действительно близко, с двумя ошибками:

1) Ошибка вы получаете говорит вам, что в самом начале JSON он ожидает начало массива ([), но вместо этого получил начало объекта ({). JSON, который вы опубликовали, не, что вы кормите Gson (см. Ниже).

2) Когда вы исправите выше, у вас есть одна небольшая проблема в вашем Person POJO:

public ArrayList<Profile> profile; 

должен быть:

public ArrayList<Image> profile; 

Вы на самом деле не нужен ваш Profile класса; profile в JSON is массив. Как-это вы получите другую ошибку, подобное тому, что вы получаете сейчас, потому что это было бы ожидая ArrayList из Profile объектов: "profile":[{"image":[{imageobject},...]},{"image":[{imageobject},...]}]

Если вы фиксируете номер два и кормить Gson в JSON вы выложили, это работает отлично. Вы разместили массив объектов Person, но то, что вы на самом деле имеете в своем коде (в json), является либо одним объектом ... или объектом, который содержит массив, который вы разместили. Небольшой пример ниже отлично работает (после коррекции вашего Person класс):

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); 
    } 
} 

Изменить, чтобы добавить: Вы на самом деле есть некоторые преобразования типов, идущие на что Gson обрабатывает для вас ... но вы не можете действительно хотите , Например, в вашем JSON score есть int, но в вашем POJO вы сделали его String. Гссон молча делает конверсию.

Кроме того, просто создание SSCCE (http://sscce.org/), как то, что я сделал выше, может помочь вам отладить эти проблемы.

+0

Привет, Брайан, я проверил полученный json и обновил Person POJO, как вы заявили. Я дам информацию, когда я попробую. спасибо –

+0

спасибо, что это отлично сейчас. –

+0

hi brian, я думаю, что я пропустил одну точку в этом ответе, потому что даже если атрибуты изображения заполняются, когда я получаю список людей, наблюдающих, что все атрибуты изображения равны нулю. У вас есть идея по этому поводу? –

Смежные вопросы