GSON десериализация массива пользовательских объектов - PullRequest
7 голосов
/ 23 августа 2011

Я пытаюсь сериализовать / десериализовать JSON в Android с помощью GSON. У меня есть два класса, которые выглядят так:

public class Session {
@SerializedName("name")
private String _name;
@SerializedName("users")
private ArrayList<User> _users = new ArrayList<User>();
}

и

public class User {
@SerializedName("name")
private String _name;
@SerializedName("role")
private int _role;
}

Я использую GSON для сериализации / десериализации данных. Я сериализирую так:

Gson gson = new Gson();
String sessionJson = gson.toJson(session);

Это даст JSON, который выглядит следующим образом:

{
"name":"hi",
    "users":
[{"name":"John","role":2}]
}

И я десериализую так:

Gson gson = new Gson();
Session session = gson.fromJson(jsonString, Session.class);

Когда я звоню, я получаю сообщение об ошибке.

DEBUG/dalvikvm(739): wrong object type: Ljava/util/LinkedList; Ljava/util/ArrayList;
WARN/System.err(739): java.lang.IllegalArgumentException: invalid value for field

Я не знаю, что означает эта ошибка. Я не вижу, что делаю что-то серьезно неправильно. Любая помощь? Спасибо!

1 Ответ

11 голосов
/ 26 марта 2012

Измените свой код на это:

  public class Session {
     @SerializedName("name")
     private String _name;
     @SerializedName("users")
     private List<User> _users = new ArrayList<User>();
  }

Рекомендуется использовать интерфейсы, и GSON требует этого (по крайней мере, без дополнительной настройки).

Gson преобразует массив "[]" в javascript в объект LinkedList.

В вашем коде GSON пытается внедрить LinkedList в поле _users, думая, что это поле является списком.

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