Разбор вложенного объекта JSON в Android - PullRequest
7 голосов
/ 13 мая 2011

Я пытаюсь проанализировать объект JSON, часть которого выглядит следующим образом:

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

Но когда я попробую это для 'name:', это не сработает.

Я пробовал:

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

Когда я пытаюсь это сделать, я получаю сообщение "JSONObject [business] not found."

И когда я пытаюсь:

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

Я получаю, как и ожидалось, «JSONObject [имя] не найден».

Что я здесь не так делаю? Мне не хватает чего-то простого ....

Ответы [ 3 ]

31 голосов
/ 13 мая 2011

Хорошо, я идиот.Это работает.

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

Если бы я подумал только две секунды, прежде чем отправлять ... Джис!

14 голосов
/ 14 августа 2014

Здесь однолинейное решение

String myString = myJsonObject.getJSONObject("offer").getJSONObject("business").getString("name");
3 голосов
/ 14 мая 2011

Обратите внимание, что сериализацию / десериализацию JSON в / из объектов Java не нужно выполнять «вручную». Такие библиотеки, как GSON и Джексон делают это очень просто.

import java.text.DateFormat;
import java.util.Date;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;</p>

<p>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\"" + 
          "}" + 
        "}" + 
      "}" + 
    "}";</p>

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

<p>class OfferContainer
{
  private Offer offer;</p>

<p>@Override
  public String toString()
  {
    return offer.toString();
  }
}</p>

<p>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;</p>

<p>@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);
  }
}</p>

<p>enum Category
{
  Salon
}</p>

<p>class Business
{
  private String name;
  private String phone;
  private Address address;</p>

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

<p>class Address
{
  private String address_1;
  private String address_2;
  private String city;
  private String cross_streets;
  private String state;
  private String zip;</p>

<p>@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 не работает с именами атрибутов JSON, такими как "address_1".

Если производительность обработки JSON вызывает беспокойство, взгляните на Jackson Vs. Гсон и http://www.cowtowncoder.com/blog/archives/2011/01/entry_437.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...