使用Json解析Gson在Android上不起作用

4
我有一个Web服务类,可以成功地将我的JSON数据从一个源中提取到一个字符串中。我想使用Gson将其解析为自定义类的列表,但是解析过程出现了问题。
目前执行解析的代码如下: http://pastie.org/2079115。 JSON已经包含在内。
我认为问题出现在那个额外的层次上。
"article": { ... }, "article": { ... } ...

几乎所有我在网上找到的资料都告诉我按照上面所述的方式进行操作,包括Gson API。
问题在于articles变量最终变成了一个列表,其中包含正确数量的文章,但是每篇文章中的所有数据都为空。我已经尝试过文章结构的修改。
Type collectionType = new TypeToken<ArrayList<Article>>(){}.getType;

但是任何更改最终都会导致articles变量为空,甚至不保留空的Articles。你有什么想法从这里开始吗?
供参考,我的Article.java如下: http://pastie.org/2079165

1
你有没有想过尝试使用像Jackson这样的不同库? - Paul Huff
转换为Jackson不会对此问题有所帮助。Jackson目前没有自动解包对象的功能,使用Jackson的任何数据绑定解决方案都与使用Gson的类似数据绑定解决方案基本相同。 - Programmer Bruce
1
我真的希望框架不要添加这些(通常是无用的)额外包装层 - 它们似乎是开发人员困惑的主要原因。而库是否应该支持这种包装是一把双刃剑:支持越多,这个“特性”就会被越多地使用... - StaxMan
最重要的是给开发人员提供补偿工具。在这种情况下,我正在移植一款使用Objective Resource的iPhone应用程序,它运行良好,并且对边缘情况进行了充分的文档记录。相比之下,Droid dev和Gson似乎都缺乏文档和示例,这使得补偿变得更加困难。这是我的第一个Android应用程序,学习曲线非常陡峭。希望随着Android社区的成熟和壮大,这些工具将变得更加全面。 - chrisk
1个回答

3
问题在于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;
}

那正是我需要的微调。非常感谢! - chrisk
对不起,我不明白如何使用这个.... 我正在解析类似于你的例子中解释的内容... 我无法解析的问题是:"classification":"ab 0", "genres":"Drama", "trailer": {"de": [{"id":"11471452", "name":"Trailer 1", "hq":false}], "ov":[]}, "trailer_url":"xxx", ...从"trailer"开始.. 在那里只有一个条目,其他一切都正常工作... - cV2
1
@cV2 -- 如果您有问题,我建议创建一个新的帖子。 - Programmer Bruce
非常感谢您的回复...评论中的格式真的很糟糕 :) 所以感谢您的建议,目前我已经找到了一个解决方法。但我认为我在网上遇到过这个问题几次,但是无法理解解决方案。感谢您的回复 :) - cV2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接