如何在android中使用Jackson解析json响应?

时间:2014-02-17 09:26:28

标签: android json jackson

我通过点击网址获得了一些json响应。我想用jackson来解析json的响应。我尝试使用对象Mapper但我得到了异常。

JSON:

{
    "contacts": [
        {
                "id": "c200",
                "name": "ravi raja",
                "email": "raja@gmail.com",
                "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": "johnny_depp@gmail.com",
                "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);

3 个答案:

答案 0 :(得分:7)

正如我所看到的,你的json不是数组,而是包含一个包含数组的对象的对象,所以你需要创建一个临时的数据持有者类,让Jackson解析它。

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 = true)注释确保当您的类不包含json中的属性时,您不会获得异常,例如json中的address可以给出异常,或Phone对象中的home

答案 1 :(得分:3)

我总是使用jsonschema2pojo.org创建我的Model / Pojo类!

您需要提供您的json数据,并根据该数据为您创建pojo / Model类!很酷!

答案 2 :(得分:-1)

示例Json数据

{
  "records": [

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

您需要在assert forder中存储sample.json,然后代码

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