Gson的简单使用

很早就听过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转化我我们定义的类型对象并返回。反过来也一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值