2011-05-13 171 views
7

我试图解析JSON对象,部分看起来是这样的:解析嵌套的JSON对象的Android

{ 
"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" 
     } 
    }, 

等等....

到目前为止,我能够非常简单地分析,这样做有点事:

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);` 

但是当我尝试它的名字:“它不会工作。

我已经试过: “把JSONObject [商家]未找到”

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

当我尝试,我得到

,当我尝试:

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

我得到的,符合市场预期, “JSONObject的[名]未发现”。

我在这里做错了什么?我失去了一些基本的东西....

+0

您好我refred以下页面,并得到了解决 http://stackoverflow.com/questions/5986123/parsing-nested-json-object-in-android – 2012-01-10 08:28:06

回答

28

好吧,我是个白痴。这工作。

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

如果我只想在发布前两秒钟...... Jees!

+1

哈哈很高兴你想通了!不要忘记接受你自己的答案我认为有一些虚荣徽章的; - ) – schwiz 2011-05-13 02:59:48

+0

呵呵。不能接受我自己的答案另外2天:( – LuxuryMode 2011-05-13 03:34:15

3

请注意,序列化/反序列化JSON到/从Java对象不必“手动”完成。像GSONJackson这样的库使它非常容易。

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

请注意,FieldNamingPolicy可用于将属性名称从JSON轻松映射到Java代码。不幸的是,LOWER_CASE_WITH_UNDERSCORES策略不适用于像“address_1”这样的JSON属性名称。

如果JSON处理性能是一个问题,然后看看Jackson Vs. Gsonhttp://www.cowtowncoder.com/blog/archives/2011/01/entry_437.html

+0

哇,这是真棒的东西。非常感谢。是要接受我自己的答案,但现在我不太确定....) – LuxuryMode 2011-05-13 23:13:52

+1

我忘了提及一个几件事情。 1. GSON内置于Android 3.0+。只需使用AndroidJsonFactory。 2. HTC人士在某些HTC设备上引入了使用GSON的错误。解决方法是只使用jarjar将GSON代码移动到另一个软件包。请参阅http://code.google.com/p/google-gson/issues/detail?id=255 – 2011-05-14 04:21:56

+0

类别的单独问题,但从HttpURLConnection获取json字符串的最简单方法是什么? – LuxuryMode 2011-06-05 05:51:42

12

这里单行解决方案

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

这是非常有用的...谢谢! – smartmouse 2015-02-22 22:54:56