2013-02-16 2 views
1

Я только начал андроид prograamming и нашел хороший учебник, используя imdb api. вместо использования xml в этом уроке я бы хотел использовать json и для получаемого json у меня проблема. это person.json:вложенный json синтаксический анализ для android с jackson

[ 
     { 
    "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: Может не десериализовать экземпляр com.example.imdbsearcher.model.Person из токена START_ARRAY 02-16 18: 34: 48.180: W/System.err (376): at [Источник: [email protected]; строка: 1, столбец: 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, как указано выше.

, но теперь я получаю ту же ошибку для профиля.

Не может десериализацию экземпляра com.example.imdbsearcher.model.Profile из START_ARRAY лексем

+0

Сообщение полной stacktrace пожалуйста. – nhaarman

+0

Я добавил модифицированную версию класса к моему ответу –

ответ

2

Вы должны десериализации список, так как ваш 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

Update:

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

Есть несколько способов борьбы с этим. Это даст вам связанную карту хэша для профиля.

В качестве альтернативы, если вы контролируете формат JSON, изменить синтаксис профиля к этому:

"profile":[ 
     image:..., 
     image:... 
] 
+0

спасибо, но я все еще не могу понять в этом сопоставлении, как Джексон будет отображать атрибуты изображения? –

+0

ok Я думаю, что это будет публично Профиль в моем случае, разве нет? –

+0

У вас JSON включает только один объект для свойства «изображение», а не массив JSON. Таким образом, это должен быть просто объект «Image». – StaxMan

2

Это потому, что вы пытаетесь десериализации списка Person.class, а не один экземпляра. Создайте еще один класс, как этот

public class PersonList extends ArrayList<Person> {} 

, а затем использовать

ArrayList<Person> people = mapper.readValue(jsonResponseString, PersonList.class); 
+2

Это или сопоставление с массивом: 'Person [] people = mapper.readValue (jsonResponseString, Person []. Class);' (массивы довольно приятные, так как они строго типизированы без дженериков) – StaxMan

0

Остальные два ответа четко объяснить причину ошибки, она получила бы избавиться от ошибки, и он будет анализировать Объект 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 
Смежные вопросы