2010-09-21 37 views
50

我試圖用GSON反序列化從我的web服務GSON和反序列化對象的使用數組的數組在它

結構將返回TypeDTO[]返回的JSON字符串。

其中TypeDTO就像

int id; 
String name; 
ArrayList<ItemDTO> items[] 

和ItemDTO就像

int id; 
String name; 
Boolean valid; 

當我調用的代碼如下對象中

Gson gson = new Gson(); 
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class); 

一切都是空

但是,如果我使用

JSONArrayJSONObject將它們從org.json罐中逐塊拉出,它可以正常工作並且相應地填充字段。

任何想法,我做錯了什麼? Gson非常快? 還是我最好堅持我已經工作了?

謝謝, 大衛

+0

您需要提供更多信息。你收到的JSON格式是什麼?爲什麼你的'TypeDTO'中有一個'ArrayList'數組? Gson處理這種事情很好。 – ColinD 2010-09-21 20:13:44

+0

我以爲我給了JSON的清晰圖片。頂級是對象列表。每個對象都有多個kv對,其中一個是具有更多kv對的另一個對象列表。 – DavieDave 2010-09-23 02:49:37

+0

任何人都有建議? – DavieDave 2010-10-13 12:06:10

回答

98

在原來的問題不會在評論中JSON結構的描述不符的例子Java數據結構。

的JSON被描述爲

「的陣列{物體的陣列{對象}}」。

在的問題中描述的類型而言,JSON翻譯成Java數據結構,其將匹配,便於反序列化與GSON的JSON結構是

「{TypeDTO對象的陣列與陣列{ ItemDTO對象}}「。

但問題中提供的Java數據結構不是這樣的。相反,它是

「{TypeDTO對象的數組,其中{ItemDTO對象的數組} {}的數組}。

一個二維數組!!=一維數組。

這個第一個例子演示瞭如何使用Gson簡單地反序列化和序列化一個JSON結構,該結構是「{object {array} {object}}}」的數組。

input.json內容:

[ 
    { 
    "id":1, 
    "name":"name1", 
    "items": 
    [ 
     {"id":2,"name":"name2","valid":true}, 
     {"id":3,"name":"name3","valid":false}, 
     {"id":4,"name":"name4","valid":true} 
    ] 
    }, 
    { 
    "id":5, 
    "name":"name5", 
    "items": 
    [ 
     {"id":6,"name":"name6","valid":true}, 
     {"id":7,"name":"name7","valid":false} 
    ] 
    }, 
    { 
    "id":8, 
    "name":"name8", 
    "items": 
    [ 
     {"id":9,"name":"name9","valid":true}, 
     {"id":10,"name":"name10","valid":false}, 
     {"id":11,"name":"name11","valid":false}, 
     {"id":12,"name":"name12","valid":true} 
    ] 
    } 
] 

Foo.java:

import java.io.FileReader; 
import java.util.ArrayList; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 
    System.out.println(gson.toJson(myTypes)); 
    } 
} 

class TypeDTO 
{ 
    int id; 
    String name; 
    ArrayList<ItemDTO> items; 
} 

class ItemDTO 
{ 
    int id; 
    String name; 
    Boolean valid; 
} 

該第二示例使用代替的JSON結構,它實際上是「{TypeDTO物體的陣列一個{ItemDTO對象}}數組的數組「來匹配最初提供的Java數據結構。

input.json內容:

[ 
    { 
    "id":1, 
    "name":"name1", 
    "items": 
    [ 
     [ 
     {"id":2,"name":"name2","valid":true}, 
     {"id":3,"name":"name3","valid":false} 
     ], 
     [ 
     {"id":4,"name":"name4","valid":true} 
     ] 
    ] 
    }, 
    { 
    "id":5, 
    "name":"name5", 
    "items": 
    [ 
     [ 
     {"id":6,"name":"name6","valid":true} 
     ], 
     [ 
     {"id":7,"name":"name7","valid":false} 
     ] 
    ] 
    }, 
    { 
    "id":8, 
    "name":"name8", 
    "items": 
    [ 
     [ 
     {"id":9,"name":"name9","valid":true}, 
     {"id":10,"name":"name10","valid":false} 
     ], 
     [ 
     {"id":11,"name":"name11","valid":false}, 
     {"id":12,"name":"name12","valid":true} 
     ] 
    ] 
    } 
] 

Foo.java:

import java.io.FileReader; 
import java.util.ArrayList; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 
    System.out.println(gson.toJson(myTypes)); 
    } 
} 

class TypeDTO 
{ 
    int id; 
    String name; 
    ArrayList<ItemDTO> items[]; 
} 

class ItemDTO 
{ 
    int id; 
    String name; 
    Boolean valid; 
} 

至於其餘兩個問題:

是GSON非常快?

未與其他反序列化/序列化API進行比較。 Gson傳統上是amongstslowest。據報道,目前和未來的Gson版本包括顯着的性能改進,儘管我沒有尋找最新的性能測試數據來支持這些聲明。這就是說,如果Gson足夠快滿足您的需求,那麼因爲它使得JSON反序列化變得如此簡單,所以使用它可能是有意義的。如果需要更好的性能,那麼Jackson可能是更好的選擇。它提供了許多(甚至可能全部)Gson的便利。

還是我最好堅持我已經工作了?

我不會。我想大多數的人總是有點有像

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class); 

的代碼一個簡單的線條......很容易反序列化到一個複雜的數據結構,比那三十行代碼,否則將需要的作品一起在一個組件映射一次。

+0

感謝您的解決方案,經過三個小時的徒勞嘗試,您的方法是我找到的最好方法。 – Awemo 2012-05-29 13:08:41

+7

@Programmer Bruce +1表示「寧願有一行簡單的代碼」。 GSON的強大功能並不在於它解析的速度有多快,而是編寫和維護大量生產案例所需的代碼的速度。而當你需要優化時,GSON的流媒體模型確實可以提高性能。 – 2012-08-28 07:44:09

0

如果您的JSON數據以數組對象開頭,請使用您的bean類。它可以幫助你。

Users[] bean = gson.fromJson(response,Users[].class); 

用戶是我的bean類。

響應是我的JSON數據。

相關問題