Gson的简单使用
2015-11-26 21:27
423 查看
很早就听过Gson的大名,以前也只是看了一下别人写的示例代码,觉得很简单,就没有自己实践。今天恰好要用到,所以就记录一下。
首先自然是导入Gson的jar包
应用场景还是上一篇中的位置信息。
首先我们需要有一个类
这里我们使用了@SerializedName(“state_name”)注解,它表示stateName的这个属性序列化的名称是state_name我们看一下json数据里面的值和注解里面的
可以看到与我们注解里面的一样。
接下来,看具体的实现
首先有一个Gson对象,我们序列化和反序列化都是通过这个对象实现的。接下来我们读取json文件
然后就是非常重要的一步,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的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转化我我们定义的类型对象并返回。反过来也一样
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories