2014-09-28 76 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);