Десериализация JSON в нестатические вложенные классы с использованием Gson

Согласно этому Gson может десериализоваться во внутренние классы. У меня есть следующий фрагмент строки JSON:

...
"coordinates": {
    "coordinates": [106.80552006,-6.22016938],
    "type": "Point",
}
...

Я использую следующий класс:

public class Tweet {
  public Coordinates coordinates = new Coordinates();

  public class Coordinates {
    public double[] coordinates;
  }
}

и пытается разобрать строку JSON:

Tweet tweet = gson.fromJson(string, Tweet.class);
Tweet.Coordinates tweetCoordinates = gson.fromJson(string, Tweet.Coordinates.class);

Но я получаю эту ошибку:

Expected BEGIN_ARRAY but was BEGIN_OBJECT

Не могли бы вы сказать мне, где ошибка?

1 ответ

Решение

Когда я использовал Gson с вложенными классами, мне всегда нужно было делать их static работать... В вашей ссылке говорится, что это не нужно, но в документации Gson четко сказано:

"Gson также может десериализовать статические вложенные классы. Однако Gson не может автоматически десериализовать чистые внутренние классы, поскольку их конструктору без аргументов также нужна ссылка на содержащий объект, который недоступен во время десериализации. Вы можете решить эту проблему с помощью либо сделав внутренний класс статичным, либо предоставив для него собственный InstanceCreator."


В любом случае, если это действительно возможно десериализовать в нестатический внутренний класс, ваша проблема будет в том, что...

Сначала вы анализируете JSON со своим классом Tweet с:

Tweet tweet = gson.fromJson(string, Tweet.class);

который должен работать, так как класс Tweet соответствует ответу JSON. Однако затем вы пытаетесь проанализировать тот же ответ JSON с классом Coordinatesчто, очевидно, не соответствует ответу JSON... более того, нет никакого смысла анализировать один и тот же ответ дважды!

Если ваш первый синтаксический анализ действительно работает, если вы хотите получить доступ к Coordinates объект, просто сделайте:

Tweet.Coordinates tweetCoordinates = tweet.getCordinates();

Если разбор с классом Tweet тоже не работает, попробуйте сделать внутренний класс staticи если это не сработает, пожалуйста, прокомментируйте, и я постараюсь найти другое решение...

Другие вопросы по тегам