2014-02-17 6 views
8

Я получаю ответ json, нажимая url. Я хочу использовать джексон для анализа ответа json. Я пытался с объектом Mapper, но получаю исключения.Как разобрать ответ json с помощью Джексона в Android?

JSON:

{ 
    "contacts": [ 
     { 
       "id": "c200", 
       "name": "ravi raja", 
       "email": "[email protected]", 
       "address": "xx-xx-xxxx,x - street, x - country", 
       "gender" : "male", 
       "phone": { 
        "mobile": "+91 0000000000", 
        "home": "00 000000", 
        "office": "00 000000" 
       } 
     }, 
     { 
       "id": "c201", 
       "name": "Johnny Depp", 
       "email": "[email protected]", 
       "address": "xx-xx-xxxx,x - street, x - country", 
       "gender" : "male", 
       "phone": { 
        "mobile": "+91 0000000000", 
        "home": "00 000000", 
        "office": "00 000000" 
       } 
     }, 

    ] 
} 

POJO:

public class ContactPojo { 

    String name,email,gender,mobileno; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 

    public String getMobileno() { 
     return mobileno; 
    } 

    public void setMobileno(String mobileno) { 
     this.mobileno = mobileno; 
    } 

} 

код:

ObjectMapper mapper=new ObjectMapper(); 
      userData=mapper.readValue(jsonResponse,ContactPojo.class); 
+0

Опубликовать ваши синтаксические коды. – Hariharan

ответ

5

Как я могу видеть ваш JSON не массив, но объект, который содержит один объект, содержащий массив поэтому вам нужно создать временный класс данных, чтобы заставить Джексона разобрать его.

private static class ContactJsonDataHolder { 
    @JsonProperty("contacts") 
    public List<ContactPojo> mContactList; 
} 

public List<ContactPojo> getContactsFromJson(String json) throws JSONException, IOException { 

    ContactJsonDataHolder dataHolder = new ObjectMapper() 
     .readValue(json, ContactJsonDataHolder.class); 

    // ContactPojo contact = dataHolder.mContactList.get(0); 
    // String name = contact.getName(); 
    // String phoneNro = contact.getPhone().getMobileNro(); 
    return dataHolder.mContactList; 
} 

И маленькие хитрости для вашего класса:

@JsonIgnoreProperties(ignoreUnknown=true) 
public class ContactPojo { 

    String name, email, gender; 
    Phone phone; 

    @JsonIgnoreProperties(ignoreUnknown=true) 
    public static class Phone { 

     String mobile; 

     public String getMobileNro() { 
       return mobile; 
     } 
    } 

    // ... 

    public Phone getPhone() { 
     return phone; 
    } 

@JsonIgnoreProperties (ignoreUnknown = истина) аннотация гарантирует, что вы не получаете исключения, когда ваш класс оленьей кожи содержит свойство, которое находится в JSON , как address в вашем json может дать исключение, ИЛИ home в объекте телефона.

+0

У меня есть одно сомнение в том, что ==> contact.getPhone в String phoneNro = contact.getPhone.getMobileNro(); – skyshine

+0

Да, спасибо, разбудил это быстро, поэтому я пропустил '()' from getPhone :) – vilpe89

-1

данные Пример JSon

{ 
    "records": [ 

    {"field1": "outer", "field2": "thought"}, 
    {"field2": "thought", "field1": "outer"} 
    ] , 
    "special message": "hello, world!" 
} 

Вы должны хранить sample.json в Assert Forder, а затем код

try 
{ 

    InputStreamReader foodDataIn = new InputStreamReader(getAssets().open("sample.json")); 
    ObjectMapper mapper = new ObjectMapper(); 
    JsonParser jp = mapper.getFactory().createParser(foodDataIn); 
    JsonToken current; 

    current = jp.nextToken(); 
    if (current != JsonToken.START_OBJECT) { 
     System.out.println("Error: root should be object: quiting."); 
     return; 
    } 
    while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String fieldName = jp.getCurrentName(); 
     // move from field name to field value 
     current = jp.nextToken(); 
     System.out.println("NAme: " +fieldName); 
     if (fieldName.equals("records")) { 
      if (current == JsonToken.START_ARRAY) { 
       // For each of the records in the array 
       while (jp.nextToken() != JsonToken.END_ARRAY) { 
        // read the record into a tree model, 
        // this moves the parsing position to the end of it 
        JsonNode node = jp.readValueAsTree(); 
        // And now we have random access to everything in the object 
        System.out.println("field1: " + node.get("field1").asText()); 
        System.out.println("field2: " + node.get("field2").asText()); 
       } 
      } else { 
       System.out.println("Error: records should be an array: skipping."); 
       jp.skipChildren(); 
      } 
     } else { 
      System.out.println("Unprocessed property: " + fieldName); 
      jp.skipChildren(); 
     } 
    }  
} catch (IOException e) { 
    e.printStackTrace(); 
} 
2

Ну я всегда создаю мой Модель/Pojo класса с использованием jsonschema2pojo.org!

вам необходимо предоставить данные json и на основе этих данных он создаст класс pojo/Model для вас! очень круто !

+0

Не отвечает прямо на вопрос, но это очень полезный инструмент, которого я раньше не видел! – SacredSkull

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