Android之gson操作系列3之fromjson

Android之gson系列3之fromjson

文章链接:

知识点:

  1. fromJson方法的简介和使用;
  2. 利用JsonReader手动解析数据;
  3. JsonWriter生产json;
  4. 新名词记录(JsonReader;JsonWriter)

概述

上一篇文章讲了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}

总结

这里的内容并不多,内容也比较简单,权当一个引导的作用,有兴趣的朋友可以深入去了解序列化和反序列化的原理。

如有任何问题,请及时与我联系,谢谢!

你可能感兴趣的:(Java)