2011-06-16 214 views
4

我有一個Web服務類,它可以成功將我的JSON從一個源中提取到String。我想使用Gson將它解析爲一個自定義類的List,但解析會以某種方式混亂。解析Gson與Json不適用於Android

現在執行解析的代碼如下所示: http://pastie.org/2079115。 包含JSON。

我相信是因爲

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

幾乎一切我能找到網上告訴我要做得像以上,包括GSON API的額外層的問題。

問題是articles變量最終成爲具有正確文章數量的列表,但每篇文章中的所有數據均爲null。我玩弄的

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

結構,但任何改變只是在文章的變量可以爲空,甚至不持有空文章結束。任何想法從哪裏去?

僅供參考,我Article.java看起來是這樣的: http://pastie.org/2079165

+1

你有沒有想過嘗試像傑克遜這樣的不同的圖書館? – 2011-06-16 20:15:43

+0

更換爲傑克遜不會有利於這個問題。 Jackson目前沒有自動解包對象的功能,而且任何與Jackson合作的數據綁定解決方案都與Gson類似的數據綁定解決方案大致相同。 – 2011-06-16 21:08:22

+1

我真的希望框架沒有添加這些(通常是無用的)額外的包裝層 - 它們似乎是開發人員混淆的第一個來源。而且libs是否應該支持這樣的包裝是一把雙刃劍:更多的支持,更多這個「功能」被使用... – StaxMan 2011-06-20 03:36:00

回答

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; 
} 
+0

這正是我需要的調整。太感謝了! – chrisk 2011-06-16 21:42:32

+0

我#對不起,我不明白如何使用這....我解析類似的解釋在小時的例子...我不能解析的問題是: 「分類」: 「AB 0」, 「流派」: 「戲劇」, 「預告片」: \t { 「的」: \t [{ 「ID」: 「11471452」, \t 「名」: 「結尾1」, \t 「HQ」:假}], 「OV」:[]}, 「trailer_url」: 「XXX」, ......用拖車開始..它只是一個進入那裏,一切工作... – cV2 2011-07-18 19:25:37

+1

@ cV2 - 如果你有問題,我建議創建一個新的職位。 – 2011-07-19 04:47:34