上一篇文章讲了json的tojson序列化方法,这次我们来看下fromjson的反序列化方法。其实这里我们用的最多,至少我是。因为现在大部分的网络请求的数据都是使用json传输,但是数据来到本地,我们使用bean实体进行操作会更加方便,所以这里就需要一个反序列化的操作。gson给了我们这样一个功能函数fromjson();
首先我们来看下gson给了我们那几个重载的fromjson方法。
public T fromJson(String json, Class classOfT)
public T fromJson(String json, Type typeOfT)
public T fromJson(Reader json, Type typeOfT)
public T fromJson(JsonReader reader, Type typeOfT)
public T fromJson(JsonElement json, Type typeOfT)
以上几个方法的参数在上一讲都有讲过了,就不再继续讲述了,有兴趣的可以去看看http://baidi.com
我们看下怎么用,最简单的方法,前提是知道要转换的实体类的类型。如下:
String data = "{\"id\":\"11\",\"nickName\":\"tanksu\"}";
Gson gson = new Gson();
UserBean resultBean = gson.fromJson(data, UserBean.class);
System.out.println("反序列化后的数据,resultBean:" + resultBean.toString());
//反序列化后的数据:{id:11, name:tanksu}
上面的方法点击去看,其实它是调用了public T fromJson(String json, Type typeOfT)方法,对于第二个参数,传入的是一个类的类型,可以使用“类的实例.getClass()”方法获取到类的类型信息。
public T fromJson(Reader json, Class classOfT)方法,此方法参数一传入Reader的子类,Reader是一个接口类。我们这里使用到StringReader子类。从源码上面看到,其实第一个讲解的方法之后还是调用了这个方法的。我们直接看代码:
StringReader stringReader = new StringReader(data);
UserBean result = gson.fromJson(stringReader, UserBean.class);
System.out.println("反序列化后的数据,result:" + result.toString());
//反序列化后的数据,result:{id:11, name:tanksu}
对于fromjson()方法,我们点到即止。因为Google提供的API都是很好理解的。接下来我们要看下不是那么好理解的方法,扩展一下视野。
JsonReader类,继承了Closeable抽象类。Closeable用来对数据源进行关闭释放资源的抽象类。JsonReader类以流的方式读取json的编码值,并且解析json。JsonReader的操作类似于事务的处理,使用手动的方式进行数据解析,在开始beginObject()和结束endObject()的之间进行操作操作。它是依次获取到string的一个token标记(也就是key),然后通过nextXXX()方法拿到对应类型的值(也就是value)。最后我们可以将他们赋值给我们的bean实体类。其中一个用法如下:
//手动方式
String data = "{\"id\":\"11\",\"nickName\":\"tanksu\"}";
UserBean userBean = new UserBean();
JsonReader jsonReader = new JsonReader(new StringReader(data));
try {
jsonReader.beginObject();
while (jsonReader.hasNext()) {
String str = jsonReader.nextName();
switch (str) {
case "id":
userBean.setId(jsonReader.nextInt());
break;
case "nickName":
userBean.setName(jsonReader.nextString());
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
//最后要释放资源
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("反序列化后的数据,jsonReader:" + userBean.toString());
//反序列化后的数据,jsonReader:{id:11, name:tanksu}
JsonWriter产生json并输出。在beginObject()之后endObject()之前进行操作。name()方法设置key,value()方法设置value。如果一个值为空,可以直接调用nullValue()方法设置值为null。如果我们在json里头生成一个list,就需要使用到beginArray()和endArray()两个方法,并且两个方法都是可以相互套用的。在反序列化中,有getJSONArray()方法获取一个jsonarray数组。和上面的beginArray()产生一个jsonarray其实是相互序列化和反序列化的动作。如果你有手动反序列化过string,比较容易懂这个了。
不多说了,我们直接看例子:
JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
try {
writer.beginObject()
.name("name").value("yaojt")
.name("id").value(23)
.name("sex").nullValue() //null值
.endObject();
} catch (IOException e) {
e.printStackTrace();
}
try {
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
//{"name":"yaojt","id":23,"sex":null}
这里的内容并不多,内容也比较简单,权当一个引导的作用,有兴趣的朋友可以深入去了解序列化和反序列化的原理。
如有任何问题,请及时与我联系,谢谢!