在对象中使用Gson反序列化JSON

时间:2011-11-06 16:12:07

标签: android deserialization gson

我有一个JSON字符串,如下所示。这来自我在Android应用程序中使用的网站(URL输出到页面下方)。

{"posts": [{"id":"0000001","longitude":"50.722","latitude":"-1.87817","position":"Someplace 1","altitude":"36","description":"Some place 1 "},{"id":"0000002","longitude":"50.722","latitude":"-1.87817","position":"Some PLace 2","altitude":"36","description":"Some place 2 description"}]}

我想将其反序列化为List,我可以稍后在应用程序中迭代它们。我该怎么做呢?我创建了一个包含属性和方法的类以及一个List类,如下所示,然后使用fromJson对其进行反序列化,但它返回NULL。希望问题清楚,并提前多多感谢。

ListClass

包dataaccess;

import java.util.List;

public class LocationList {
    public static List<Location> listLocations;

    public void setLocationList(List <Location> listLocations) {
        LocationList.listLocations = listLocations;
    }

    public List<Location> getLocationList() {
        return listLocations;
    }
}

GSON

public LocationList[] getJsonFromGson(String jsonURL) throws IOException{
    URL url = new URL(jsonURL);
    String content = IOUtils.toString(new InputStreamReader(url.openStream()));
    LocationList[] locations =  new Gson().fromJson(content, LocationList[].class);

    return locations;
}

2 个答案:

答案 0 :(得分:2)

你试图反序列化为一个LocationList对象数组 - 这肯定不是你的意图,是吗? json片段不包含列表列表

我会删除类LocationList(除了它应该在将来扩展?),并使用纯List。然后,您必须创建一个类型标记:

java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<ArrayList<Location>>() {}.getType();
List<Location> locations = new Gson().fromJson(content, type);

答案 1 :(得分:2)

如果可以使用本机类解析此JSON响应怎么办,以下是相同的解决方案:

String strJsonResponse="Store response here";
JsonObject obj = new JsonObject(strJsonResponse);
JsonArray array = obj.getJsonArray("posts");

for(int i=0; i<array.length; i++)
{
   JsonObject subObj = array.getJsonObject(i);
   String id = subObj.getString("id");
   String longitude = subObj.getString("longitude");
   String latitude = subObj.getString("latitude");
   String position = subObj.getString("position");
   String altitude = subObj.getString("altitude");
   String description = subObj.getString("description");

   // do whatever procedure you want to do here
}