【问题标题】:Parsing Gson with Json not working for Android使用 Json 解析 Gson 不适用于 Android
【发布时间】:2011-06-16 20:01:11
【问题描述】:

我有一个 Web 服务类,它成功地将我的 JSON 从提要中提取到 String。我想用 Gson 把它解析成一个自定义类的List,但是解析搞砸了。

现在进行解析的代码如下所示: http://pastie.org/2079115。 包含 JSON。

我相信问题的发生是因为那层额外的

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

我可以在网上找到的几乎所有内容都告诉我按照上述方式进行操作,包括 Gson API。

问题在于,articles 变量最终是一个包含正确文章数量的列表,但每篇文章中的所有数据都为空。我玩弄了

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

但任何更改最终都会导致文章变量为空,甚至不包含空文章。知道从这里去哪里吗?

作为参考,我的 Article.java 如下所示: http://pastie.org/2079165

【问题讨论】:

  • 你有没有想过尝试像 Jackson 这样的不同库?
  • 改用 Jackson 对这个问题没有好处。 Jackson 目前没有自动解包对象的功能,任何使用 Jackson 的数据绑定解决方案都与使用 Gson 的类似数据绑定解决方案基本相同。
  • 我真的希望框架没有添加这些(通常是无用的)额外包装层——它们似乎是开发人员混淆的第一个来源。库是否应该支持这样的包装是一把双刃剑:支持越多,这个“特性”就越被使用......
  • 归根结底,我想最重要的是为开发人员提供补偿工具。在这种情况下,我正在移植一个使用 Objective Resource 的 iPhone 应用程序,它的工作原理就像一个魅力,并且在边缘情况下有很好的文档记录。在文档和示例方面,Droid dev 和 Gson 似乎都很稀疏,因此更难弥补这些东西。这是我的第一个 Android 应用程序,学习曲线非常陡峭。希望随着 Android 社​​区的成熟和占据主导地位,这些工具将变得更加全面。

标签: java android json parsing gson


【解决方案1】:

问题是 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;
}

【讨论】:

  • 这正是我需要的调整。谢谢一百万!
  • 对不起,我不明白如何使用它......我正在解析类似的东西,在小时示例中解释过......我无法解析的问题是:“分类”:“ ab 0", "流派":"戏剧", "预告片": {"de": [{"id":"11471452", "name":"预告片 1", "hq":false}], "ov ":[]}, "trailer_url":"xxx", ...以预告片开头..它只是一个条目,其他一切正常...
  • @cV2 -- 如果您有任何问题,我建议您创建一个新帖子。
  • 非常感谢您的回复... cmets 中的格式真的很糟糕 :) 所以感谢您的建议,现在我找到了解决方法。但我想我在网上发现了几次这个问题,但无法理解解决方案。谢谢你的回复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2011-02-12
相关资源
最近更新 更多