Десериализация 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
и если это не сработает, пожалуйста, прокомментируйте, и я постараюсь найти другое решение...