2013-07-12 308 views
2

我有一個對象GSON反序列化對象

public class Point{ 
    int x, y; 

    Point(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

    public String toString(){ 
     String ret = "["; 
     ret += Integer.toString(x); 
     ret += ", "; 
     ret += Integer.toString(y); 
     ret += "]"; 
     return ret; 
    } 
} 

我已經能夠反序列化此對象GSON像這樣的數組:

class PointDeserializer implements JsonDeserializer<Point>{ 
    @Override 
    public Point deserialize(JsonElement json, Type typeOfT, 
    JsonDeserializationContext context) throws JsonParseException { 
     Gson gson = new Gson(); 
     int[] tmp = gson.fromJson(json, int[].class); 
     int a = tmp[0]; 
     int b = tmp[1]; 
     return new Point(a,b); 
    }    
} 

現在,我用最後以下,使這行得通。請注意,type和str是字符串。

Class myClass = Class.forName(type); 
Class myClassDeserializer = Class.forName(type + "Deserializer"); 
Gson gson = new GsonBuilder().registerTypeAdapter(myClass, myClassDeserializer.newInstance()).create(); 
Object ret = gson.fromJson(str, myClass); 

現在這裏是主要問題。我也想爲Point[]Point[][]等等這樣做。

我需要爲Point的每個維度寫一個反序列化器嗎?還是有更好的方法來實現?

請幫忙。

回答

0

GSon擁有自己的ArrayTypeAdapter,在內部使用。我想它會在你試圖對一個數組進行反序列化時自動使用,因爲List和其他集合也是這樣。

由於GSon的內部功能,您通常不必執行任何操作來啓用或使用它。

+0

能否請您給一些 有關如何做的細節? – Rishi

5

首先,您確實在解串器中引入了一些不需要的開銷。不需要創建本地Java數組;你已經有了一個JSON陣列:

class PointDeserializer implements JsonDeserializer<Point> { 

    @Override 
    public Point deserialize(JsonElement json, Type typeOfT, 
     JsonDeserializationContext context) throws JsonParseException { 

     JsonArray array = json.getAsJsonArray(); 
     return new Point(array.get(0).getAsInt(), array.get(1).getAsInt()); 

    } 
} 

一旦你註冊與GSON通過registerTypeAdapter,對該類型的數組 「只是工作」:

public static void main(String[] args) 
{ 
    String json = "[ [1,2], [3,4] ]"; 

    Gson gson = new GsonBuilder().registerTypeAdapter(Point.class, 
        new MyPointDeserializer()).create(); 

    Point[] mpa = gson.fromJson(json, Point[].class);   
    System.out.println(mpa[1].x); 
} 

輸出:

您遇到的麻煩是您需要獲得Class動態和你想要的數組類型。您可以通過預先[L到完全合格的類名實現這個數組類型:

Class myClass = Class.forName("[L" + "my.package.Point"); 

myClass現在持有Point[].class

這有點變得比較難看的,當你開始談論多個維度着急。它的工作原理...您可以使用額外的[代表的尺寸......但你仍然需要把它找回來爲Object和演員表等

老實說,更好的方式來做到這一點是通過List輸入TypeToken

public static void main(String[] args) 
{ 

    String json = "[ [[1,2]], [[3,4]] ]"; 

    Gson gson = new GsonBuilder().registerTypeAdapter(Point.class, new MyPointDeserializer()).create(); 

    Point[][] mpa = gson.fromJson(json, Point[][].class); 

    System.out.println(mpa[1][0].x); 

    Type listType = new TypeToken<ArrayList<ArrayList<Point>>>(){}.getType(); 

    List<List<Point>> list = gson.fromJson(json, listType); 

    System.out.println(list.get(1).get(0).x); 

} 

輸出:

2

這是如何反序列化對象的數組:

Gson gson = new Gson(); 
Type collectionType = new TypeToken<List<YourObject>>(){}.getType(); 
List<YourObject> yourObjectsList= gson.fromJson(jsonString, collectionType); 

編碼愉快:)