Разбор Gson с Json не работает для Android - PullRequest
4 голосов
/ 17 июня 2011

У меня есть класс веб-службы, который успешно извлекает мой JSON из канала в String.Я хочу использовать Gson для разбора его на List пользовательского класса, но синтаксический анализ как-то портится.

Сейчас код, который выполняет синтаксический анализ, выглядит следующим образом: http://pastie.org/2079115.JSON включен.

Я полагаю, что проблема возникает из-за этого дополнительного слоя

"article": { ... }, "article": { ... } ...

Практически все, что я могу найти в Интернете, подсказывает мне сделать это, как описано выше, включая Gson API.

Проблема в том, что переменная артиклей заканчивается списком с правильным количеством Артиклей, но все данные в каждой Статье равны нулю.Я поиграл со структурой

Type collectionType = new TypeToken<ArrayList<Article>>(){}.getType;

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

Для справки, мой Article.java выглядит так: http://pastie.org/2079165

1 Ответ

3 голосов
/ 17 июня 2011

Проблема в том, что структура JSON не соответствует структуре Java, пытающейся десериализоваться, и не предусмотрена специальная обработка десериализации для обработки несоответствия. Итак, да, «проблема возникает из-за этого дополнительного слоя».

Простым решением было бы изменить структуру Java, чтобы она соответствовала структуре JSON. Структура JSON:

an array of 
    an unnamed object with 
        one element named article with value of
            an object with 
                seven elements named author_id, body, catagory, created_at, id, published, updated_at

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

import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Type collectionType = new TypeToken<ArrayList<ArticleContainer>>() {}.getType();
    ArrayList<ArticleContainer> articles = gson.fromJson(new FileReader("input.json"), collectionType);
    System.out.println(gson.toJson(articles));
  }
}

class ArticleContainer
{
  Article article;
}

class Article
{
  public int author_id;
  public String body;
  public String catagory;
  public String created_at;
  public int id;
  public String published;
  public String updated_at;
}
...