Parsing nested JSON object in Android
I'm 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'm able to parse very simply, by doing this kinda thing:
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 won't work.
I've tried:
JSONObject businessObject = jObject.getJSONObject("business");
String nameValue = businesObject.getString("name");
System.out.println(nameValue);
When I try that, 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'm missing something basic....
Ok, I'm an idiot. This works.
JSONObject businessObject = offerObject.getJSONObject("business");
String nameValue = businessObject.getString("name");
System.out.println(nameValue);
If I would only think for two seconds before posting... Jees!
Here a single-line solution
String myString = myJsonObject.getJSONObject("offer").getJSONObject("business").getString("name");
Note that serializing/deserializing JSON to/from Java objects doesn't have to be done "manually". Libraries like GSON and Jackson make it very easy.
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 a FieldNamingPolicy can be used to easily map attribute names from the JSON to the Java code. The LOWER_CASE_WITH_UNDERSCORES policy unfortunately does not work with JSON attribute names like "address_1".
If the performance of JSON handling is a concern, then take a look at Jackson Vs. Gson and http://www.cowtowncoder.com/blog/archives/2011/01/entry_437.html
精彩评论