您的位置:首页 > 移动开发 > Android开发

Gson的简单使用

2015-11-26 21:27 423 查看
很早就听过Gson的大名,以前也只是看了一下别人写的示例代码,觉得很简单,就没有自己实践。今天恰好要用到,所以就记录一下。

首先自然是导入Gson的jar包



应用场景还是上一篇中的位置信息。

首先我们需要有一个类

public class State implements TreeNode<City>{
@SerializedName("state_name")
public String stateName;
@SerializedName("city_list")
public List<City>  cityList = new ArrayList<City>();
@Override
public List<City> getChildren() {
return cityList;
}

public String toString(){
return stateName;
}
}


这里我们使用了@SerializedName(“state_name”)注解,它表示stateName的这个属性序列化的名称是state_name我们看一下json数据里面的值和注解里面的



可以看到与我们注解里面的一样。

接下来,看具体的实现

public static GeoInformation<State> loadGeoInformation(Context context){
Gson gson = new Gson();
String geoInfo = getFromAssets(context, "state-city-district.json");
Type collectionType = new TypeToken<GeoInformation<State>>() {
}.getType();
return (GeoInformation<State>)gson.fromJson(geoInfo, collectionType);
}


首先有一个Gson对象,我们序列化和反序列化都是通过这个对象实现的。接下来我们读取json文件

public static String getFromAssets(Context context, String fileName){
try {
InputStreamReader inputReader =
new InputStreamReader( context.getResources().getAssets().open(fileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}


然后就是非常重要的一步,new一个TypeToken对象,简单查了一下这个类型,它是Gson带的一种数据类型,为了解决泛型类型的问题,这要依赖Java的Class字节码中存储的泛型参数信息。Java的泛型机制虽然在运行期间泛型类和非泛型类都相同,但是在编译java源代码成 class文件中还是保存了泛型相关的信息,这些信息被保存在class字节码常量池中,使用了泛型的代码处会生成一个signature签名字段,通过 签名signature字段指明这个常量池的地址。

关于class文件中存储泛型参数类型的具体的详细的知识可以参考这里:http://stackoverflow.com/questions/937933/where-are-generic-types-stored-in-java-class-files

JDK里面提供了方法去读取这些泛型信息的方法,再借助反射,就可以获得泛型参数的具体类型。具体的我也不太懂,这里就不细究了。这里GeoInformation只是一个继承了ArrayList的简单集合类。接下来我们拿到TypeToken的类型。(GeoInformation)gson.fromJson(geoInfo, collectionType);最后使用这段代码,Gson就能帮助我们将geoinfo转化我我们定义的类型对象并返回。反过来也一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gson Android