Parsing a JSON nested object in Android

I am trying to parse a JSON object, part of which looks like this:

{ "offer":{ "category":"Salon", "description":"Use this offer now to enjoy this great Salon at a 20% discount. ", "discount":"20", "expiration":"2011-04-08T02:30:00Z", "published":"2011-04-07T12:00:33Z", "rescinded_at":null, "title":"20% off at Jun Hair Salon", "valid_from":"2011-04-07T12:00:31Z", "valid_to":"2011-04-08T02:00:00Z", "id":"JUN_HAIR_1302177631", "business":{ "name":"Jun Hair Salon", "phone":"2126192989", "address":{ "address_1":"12 Mott St", "address_2":null, "city":"New York", "cross_streets":"Chatham Sq & Worth St", "state":"NY", "zip":"10013" } }, 

And so on....

So far, I could figure it out very simply, doing it somehow:

 JSONObject jObject = new JSONObject(content); JSONObject offerObject = jObject.getJSONObject("offer"); String attributeId = offerObject.getString("category"); System.out.println(attributeId); String attributeValue = offerObject.getString("description"); System.out.println(attributeValue); String titleValue = offerObject.getString("title"); System.out.println(titleValue);` 

But when I try it for "name:", it will not work.

I tried:

 JSONObject businessObject = jObject.getJSONObject("business"); String nameValue = businesObject.getString("name"); System.out.println(nameValue); 

When I try to do this, I get "JSONObject [business] not found".

And when I try:

 String nameValue = offerObject.getString("name"); System.out.println(nameValue);` 

I get, as expected, "JSONObject [name] not found".

What am I doing wrong here? I am missing something basic ...

+7
source share
3 answers

Ok, I'm an idiot. It works.

 JSONObject businessObject = offerObject.getJSONObject("business"); String nameValue = businessObject.getString("name"); System.out.println(nameValue); 

If I thought only two seconds before publishing ... Jees!

+28
source

Here's a one line solution

 String myString = myJsonObject.getJSONObject("offer").getJSONObject("business").getString("name"); 
+12
source

Note that serializing / deserializing JSON to / from Java objects does not have to be done β€œmanually”. Libraries such as GSON and Jackson make it very simple.

 import java.text.DateFormat; import java.util.Date; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; 

public class Foo { static String jsonInput = "{" + "\"offer\":{" + "\"category\":\"Salon\"," + "\"description\":\"Use this offer now to enjoy this great Salon at a 20% discount. \"," + "\"discount\":\"20\"," + "\"expiration\":\"2011-04-08T02:30:00Z\"," + "\"published\":\"2011-04-07T12:00:33Z\"," + "\"rescinded_at\":null," + "\"title\":\"20% off at Jun Hair Salon\"," + "\"valid_from\":\"2011-04-07T12:00:31Z\"," + "\"valid_to\":\"2011-04-08T02:00:00Z\"," + "\"id\":\"JUN_HAIR_1302177631\"," + "\"business\":{" + "\"name\":\"Jun Hair Salon\"," + "\"phone\":\"2126192989\"," + "\"address\":{" + "\"address_1\":\"12 Mott St\"," + "\"address_2\":null," + "\"city\":\"New York\"," + "\"cross_streets\":\"Chatham Sq & Worth St\"," + "\"state\":\"NY\"," + "\"zip\":\"10013\"" + "}" + "}" + "}" + "}";

public static void main(String[] args) throws Exception { GsonBuilder gsonBuilder = new GsonBuilder(); // gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); gsonBuilder.setDateFormat(DateFormat.LONG); Gson gson = gsonBuilder.create(); OfferContainer offerContainer = gson.fromJson(jsonInput, OfferContainer.class); System.out.println(offerContainer); } }

class OfferContainer { private Offer offer;

@Override public String toString() { return offer.toString(); } }

class Offer { private Category category; private String description; private String discount; private Date expiration; private Date published; private String rescinded_at; private String title; private Date valid_from; private Date valid_to; private String id; private Business business;

@Override public String toString() { return String.format( "[Offer: category=%1$s, description=%2$s, discount=%3$s, expiration=%4$s, published=%5$s, rescinded_at=%6$s, title=%7$s, valid_from=%8$s, valid_to=%9$s, id=%10$s, business=%11$s]", category, description, discount, expiration, published, rescinded_at, title, valid_from, valid_to, id, business); } }

enum Category { Salon }

class Business { private String name; private String phone; private Address address;

@Override public String toString() { return String.format( "[Business: name=%1$s, phone=%2$s, address=%3$s]", name, phone, address); } }

class Address { private String address_1; private String address_2; private String city; private String cross_streets; private String state; private String zip;

@Override public String toString() { return String.format( "[Address: address_1=%1$s, address_2=%2$s, city=%3$s, cross_streets=%4$s, state=%5$s, zip=%6$s]", address_1, address_2, city, cross_streets, state, zip); } }

Note that FieldNamingPolicy can be used to easily map attribute names from JSON to Java code. The LOWER_CASE_WITH_UNDERSCORES policy, unfortunately, does not work with JSON attribute names such as "address_1".

If JSON processing performance is a concern, take a look at Jackson Vs. Gson and http://www.cowtowncoder.com/blog/archives/2011/01/entry_437.html

+3
source

All Articles