Невозможно десериализовать объект с помощью List с помощью API Gson - PullRequest
2 голосов
/ 20 июля 2010

Получение следующего исключения при десериализации объекта:

com.google.gson.JsonParseException: 
  The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@1e2befa 
    failed to deserialized json object 
      {"com.gsicommerce.analytics.platform.model.webstore.AnalyticsProduct":
          [
              {"id":"3680231","longTitle":"Graco SnugRide Infant Car Seat - Pippin","available":"true"}
          ]
      } 
    given the type com.google.gson.ParameterizedTypeImpl@b565dd

Вот класс, который я пытаюсь десериализовать:

public class TrusRegWishAddItemEvent implements Serializable {
    static final long serialVersionUID = 1L;
    private final List<AnalyticsProduct> items;

    private TrusRegWishAddItemEvent() {
        items = null;
    }

    public TrusRegWishAddItemEvent(List<AnalyticsProduct> items) {
        this.items = items;
    }

    public List<AnalyticsProduct> getItems() {
        return items;
    }      
}

public class AnalyticsProduct implements Serializable {
    static final long serialVersionUID = 1L;
    private final long id;
    private final String longTitle;
    private final boolean available;

    public AnalyticsProduct() {
        id = 0;
        longTitle = null;
        available = false;
    }

    public AnalyticsProduct(long id, String longTitle, boolean available) {
        this.id = id;
        this.longTitle = longTitle;
        this.available = available;
    }

    public long getId() {
        return id;
    }

    public String getLongTitle() {
        return longTitle;
    }

    public boolean isAvailable() {
        return available;
    }
}

Пожалуйста, руководство.

1 Ответ

2 голосов
/ 10 июня 2011

Если JSON равен

{
  "items":
  [
    {
      "id":"3680231",
      "longTitle":"Graco SnugRide Infant Car Seat - Pippin",
      "available":"true"
    }
  ]
}

, то в следующем примере Gson используется для простой десериализации / сериализации в / из той же структуры данных Java в исходном вопросе.

  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TrusRegWishAddItemEvent thing = gson.fromJson(new FileReader("input.json"), TrusRegWishAddItemEvent.class);
    System.out.println(gson.toJson(thing));
  }

Есливместо этого JSON должен быть

  {"com.gsicommerce.analytics.platform.model.webstore.AnalyticsProduct":
      [
          {"id":"3680231","longTitle":"Graco SnugRide Infant Car Seat - Pippin","available":"true"}
      ]
  }

, тогда необходимо преобразовать имя элемента JSON "com.gsicommerce.analytics.platform.model.webstore.AnalyticsProduct" в член Java items.Для этого Gson предоставляет пару механизмов, самый простой из которых - просто аннотировать атрибут items в TrusRegWishAddItemEvent следующим образом.

class TrusRegWishAddItemEvent implements Serializable
{
  static final long serialVersionUID = 1L;

  @SerializedName("com.gsicommerce.analytics.platform.model.webstore.AnalyticsProduct")
  private final List<AnalyticsProduct> items;

  ...
}

Но без этой @SerializedName аннотации Gson не делает 'выдает исключение при попытке десериализации, вместо этого он просто создает экземпляр TrusRegWishAddItemEvent с items в качестве пустой ссылки.Итак, неясно, что было сделано для создания сообщения об ошибке в исходном вопросе.

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