2013-05-15 5 views
3

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

... 
"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 

Не удалось скажите, пожалуйста, где ошибка?

ответ

4

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

"Gson can also deserialize static nested classes. However, Gson can not automatically deserialize the pure inner classes since their no-args constructor also need a reference to the containing Object which is not available at the time of deserialization. You can address this problem by either making the inner class static or by providing a custom InstanceCreator for it."


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

Сначала вы разбор JSON с классом Tweet с:

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

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

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

Tweet.Coordinates tweetCoordinates = tweet.getCordinates(); 

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

+0

Большое спасибо! Теперь все отлично работает даже с нестационарным внутренним классом. – midas

Смежные вопросы