2014-09-28 107 views
3

時,避免不必要的包裝類我有一個JSON字符串:GSON - 序列化

{ 
    "Locations":{ 
     "Location":[{ 
      "elevation":"100", 
      "latitude":"0", 
      "longitude":"0", 
      "name":"Ocean" 
     }, 
     ... 
    ]} 
} 

我想序列化爲Location類的數組此使用Gson

public class Location { 
    public double elevation; 
    public double latitude; 
    public double longitude; 
    public String name; 
} 

而不是做一個Locations類和具有Locations字段的包裝類。這是可能的+如何?

+0

只需創建相應的地圖和列表並序列化那些。在完成問題之前,這將完成。 – 2014-09-28 12:59:53

+0

@HotLicks示例?我以前從未這樣做過 – Edd 2014-09-28 13:14:40

+0

創建包含高程,緯度,經度,名稱的地圖。將該地圖放入一個列表中,將該列表放置在名稱爲「地點」的地圖中。將該地圖放在名稱爲「地點」的地圖中。使用您選擇的工具包進行序列化。如果你願意,可以使用你選擇的工具包而不是Map/List的特定類。 – 2014-09-28 13:47:22

回答

1

這應該工作:

jsonStr = "..."; 

Class<? extends HashMap> mapType = new HashMap<String, Object>().getClass(); 
Map data = new Gson().fromJson(job.jobContext, mapType); 

JsonObject locations = data.get("Locations").getAsJsonObject(); 
JsonArray locationAry = locations.get("Location").getAsJsonArray(); 

for(JsonElement jsonEle: locationAry) { 
    Location loc = new Location(); 
    JsonObject jsLoc = jsonEle.getAsJsonObject(); 
    loc.elevation = jsLoc.get("elevation").getAsInt(); 
    // ... 
} 
+0

無論如何,我可以將它與Gson分離嗎? – Edd 2014-09-28 12:58:54

+0

@clairharrison - 使用普通的舊Java地圖和列表,你可以使用幾乎任何JSON套件來序列化它。 – 2014-09-28 13:00:31

+0

您的意思是讓它適用於任何JSON解析器?我不確定。 – ryenus 2014-09-28 13:01:25

1

你可以得到Locaitons對象,然後將Location陣列。下面的代碼是純Gson:

String jsonAsText = "{\"Locations\":{\"Location\":[{\"elevation\":\"100\",\"latitude\":\"0\",\"longitude\":\"0\",\"name\":\"Ocean\"},{\"elevation\":\"100\",\"latitude\":\"0\",\"longitude\":\"0\",\"name\":\"Ocean\"}]}}"; 

GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 

java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken<List<Location>>(){}.getType(); 

JsonArray locationJsonList = (JsonArray) ((JsonObject) gson.fromJson(jsonAsText, JsonObject.class).get("Locations")).get("Location"); 
List<Location> locatioList = gson.fromJson(locationJsonList, listType);