десериализовать массив json с помощью gson - PullRequest
0 голосов
/ 05 июня 2011

Я десериализирую объект json следующим образом:

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;
    private Location location;
    private Long distance;


    public String getDescription() {
        return String.format("[Offer: description=%2$s]", description);

    }

    @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, location=%12$s, distance=%13$s]",
                category, description, discount, expiration, published, rescinded_at, title, valid_from, valid_to, id,
                business, location, distance);
    }
}

Как видите, всякий раз, когда есть вложенный объект, я просто ссылаюсь на класс, который имеет метод toString() для этого конкретного вложенного объекта json. Мой вопрос: когда объект json содержит массив, который в моем случае выглядит примерно так:

"draws":[ "Hair Cut", "Blow Dry", "Blow Dry Treatment" ]

... как мне использовать format.toString() для десериализации этого массива и затем поместить его в мой Offer toString()?

1 Ответ

0 голосов
/ 06 июня 2011

Давайте уточним значение двух терминов.

  1. Сериализация : преобразовать объект в последовательность байтов.
  2. Десериализация : для анализа (сериализованных данных) с целью восстановления исходного объекта.

Итак, @LuxuryMode, когда вы сказали «десериализовать», вы имели в виду «сериализацию»?

Предполагая, что это так ...

Обратите внимание, что ваша реализация toString в настоящее время неправильно генерирует объект или массив JSON или что-либо еще, что является допустимым JSON.

Я рекомендую не использовать toString или любую другую рукописную реализацию для сериализации объектов в JSON (или в XML, или в байты). Если возможно, используйте API, такой как Gson или Джексон (или XStream или API сериализации Java ).

В следующем примере сериализуется один объект Offer.

// output:
// {
//  "category":
//  {
//      "name":"category_1",
//      "type":1
//  },
//  "description":"description_1",
//  "discount":"discount_1",
//  "expiration":
//  {
//      "value":123
//  },
//  "published":
//  {
//      "value":456
//  },
//  "rescinded_at":"rescinded_at_1",
//  "title":"title_1",
//  "valid_from":
//  {
//      "value":789
//  },
//  "valid_to":
//  {
//      "value":987
//  },
//  "id":"id_1",
//  "business":
//  {
//      "name":"business_name_1",
//      "opening_date":
//      {
//          "value":654
//      }
//  },
//  "location":
//  {
//      "latitude":111,
//      "longitude":222
//  },
//  "distance":333
//}

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Foo
{
  public static void main(String[] args)
  {
    Offer offer = new Offer(
        new Category("category_1", 1), 
        "description_1", 
        "discount_1", 
        new Date(123), 
        new Date(456), 
        "rescinded_at_1", 
        "title_1", 
        new Date(789), 
        new Date(987), 
        "id_1", 
        new Business("business_name_1", new Date(654)), 
        new Location(111, 222), 
        new Long(333));

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
    Gson gson = gsonBuilder.create();
    String offerJson = gson.toJson(offer);
    System.out.println(offerJson);
  }
}

class Offer
{
  private Category category;
  private String description;
  private String discount;
  private Date expiration;
  private Date published;
  private String rescindedAt;
  private String title;
  private Date validFrom;
  private Date validTo;
  private String id;
  private Business business;
  private Location location;
  private Long distance;

  Offer(Category category, 
      String description, 
      String discount, 
      Date expiration, 
      Date published, 
      String rescindedAt, 
      String title, 
      Date validFrom, 
      Date validTo, 
      String id, 
      Business business, 
      Location location, 
      Long distance)
  {
    this.category = category;
    this.description = description;
    this.discount = discount;
    this.expiration = expiration;
    this.published = published;
    this.rescindedAt = rescindedAt;
    this.title = title;
    this.validFrom = validFrom;
    this.validTo = validTo;
    this.id = id;
    this.business = business;
    this.location = location;
    this.distance = distance;
  }
}

class Category
{
  private String name;
  private int type;

  Category(String name, int type)
  {
    this.name = name;
    this.type = type;
  }
}

class Date
{
  private long value;

  Date(long value)
  {
    this.value = value;
  }
}

class Business
{
  private String name;
  private Date openingDate;

  Business(String name, Date openingDate)
  {
    this.name = name;
    this.openingDate = openingDate;
  }
}

class Location
{
  private int latitude;
  private int longitude;

  Location(int latitude, int longitude)
  {
    this.latitude = latitude;
    this.longitude = longitude;
  }
}

Этот следующий пример берет вывод JSON из предыдущего примера и десериализует его обратно в объект Java Offer. Вы можете добавить реализации toString и / или equals, чтобы убедиться, что все атрибуты заполнены, как ожидается, но обратите внимание, что метод toString не используется Gson во время десериализации или сериализации.

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = gsonBuilder.create();
String offerJson = gson.toJson(offer);

Offer offerDeserialized = gson.fromJson(offerJson, Offer.class);

Сериализовать массив из Offer объектов также просто.

Offer offer1 = new Offer(
    new Category("category_1", 1), 
    "description_1", 
    "discount_1", 
    new Date(123), 
    new Date(456), 
    "rescinded_at_1", 
    "title_1", 
    new Date(789), 
    new Date(987), 
    "id_1", 
    new Business("business_name_1", new Date(654)), 
    new Location(111, 222), 
    new Long(333));

Offer offer2 = new Offer(
    new Category("category_2", 2), 
    "description_2", 
    "discount_2", 
    new Date(234), 
    new Date(567), 
    "rescinded_at_2", 
    "title_2", 
    new Date(890), 
    new Date(876), 
    "id_2", 
    new Business("business_name_2", new Date(543)), 
    new Location(444, 555), 
    new Long(666));

Offer[] offers = new Offer[] {offer1, offer2};

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = gsonBuilder.create();
String offersJson = gson.toJson(offers);
System.out.println(offersJson);

Этот последний пример берет вывод массива JSON из предыдущего примера и десериализует его обратно в массив объектов Offer.

Offer[] offersDeserialized = gson.fromJson(offersJson, Offer[].class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...