skyshine
skyshine

Reputation: 2864

How to parse json response using Jackson in android?

I am getting some json response by hitting url. I want to use jackson to parse json response. I tried with object Mapper but I am getting exceptions.

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

}

code:

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

Upvotes: 11

Views: 32802

Answers (3)

Indrajit Sinh Rayjada
Indrajit Sinh Rayjada

Reputation: 1243

Well i always create my Model / Pojo class using jsonschema2pojo.org!

you need to provide your json data and based on that data it will create pojo / Model class for you ! very cool !

Upvotes: 3

Raj Kumar
Raj Kumar

Reputation: 796

Example Json data

{
  "records": [

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

You need to store a sample.json in assert forder and then code is

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

Upvotes: -1

vilpe89
vilpe89

Reputation: 4702

As I can see your json is not array but is object that holds one object containing an array so you need to create a temporary dataholder class where to make the Jackson parse it.

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

And little tweaks for your class:

@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) annotation makes sure that you are not getting exceptions when your class doesnt contain property which is in the json, like address in your json could give an exception, OR home in Phone object.

Upvotes: 7

Related Questions