Android之gson操作系列1

来源:互联网 发布:mac 快捷键设置没有用 编辑:程序博客网 时间:2024/06/06 02:33

Android之gson操作系列1

文章链接:http://blog.csdn.net/qq_16628781/article/details/64246167

知识点:

  1. json的简介;
  2. json和XML的异同;
  3. gson的基本操作和@Expose注解的使用说明;
  4. 新名词记录{@expose,@SerializedName}

讲在前面:

讲gson之前,我觉得有必要讲一下json。JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
对象表示为键值对
数据由逗号分隔
花括号保存对象
方括号保存数组

JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值.例如,{“name”:”yaojt”}.
复杂一点,他还会包括一个list数组,例如{“people”:[{“name”:”yaojt”,”age”:24},{“name”:”tanksu”,”age”:18}]}。

我们知道XML也是一种标记语言。
可读性来说:
JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。
可扩展性:
XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

然后再来说一下gson。gson是一个json的库,当泛型值对象T。
gson是Google推出的用来进行数据序列化和反序列化的开源框架。
同样的操作json的框架有阿里推出的fastJson,和JackJson等等。
fastJson用过,比gson要快很多,功能也扩展了不少。但是gson作为Google的“亲儿子”,我们还是需要好好的理解它,然后才能好好的使用。


示例

先贴出两个bean实体类:分别是UserBean和GsonBean。有一些需要解释的地方我就直接在类里面对应的地方做了解释,我觉得这样才比较好的,不用每次都翻上来翻上去,思路很快就被打断了。

UserBean.java

private int id;/* value是别名,alternate是备选的名字(别名),当匹配到任意一个名字时,都可以得到正确的结果 */@SerializedName(value = "nickName", alternate = {"userName"})private String name;public int getId() {    return id;}public void setId(int id) {    this.id = id;}public String getName() {    return name;}public void setName(String name) {    this.name = name;}@Overridepublic String toString() {    return "{" +            "id:" + id +            ", name:" + name +            "}";}}

GsonBean.java

@Exposeprivate long id;@Exposeprivate String userName;private String address;private Date date;private UserBean userBean;public long getId() {    return id;}public void setId(long id) {    this.id = id;}public String getUserName() {    return userName;}public void setUserName(String userName) {    this.userName = userName;}public String getAddress() {    return address;}public void setAddress(String address) {    this.address = address;}public Date getDate() {    return date;}public void setDate(Date date) {    this.date = date;}public UserBean getUserBean() {    return userBean;}public void setUserBean(UserBean userBean) {    this.userBean = userBean;}

写测试用例

然后及时进行写“测试用例”的时候了。我会分开每一个知识点来运行测试,力求做到知识点的最小颗粒度,方便我到时候回去看,也方便各位看官去学习。

MainGsonReflect.java

/** * gson基本操作 */public void gsonBaseOperattion() {    UserBean userBean = new UserBean();    userBean.setId(10086);    userBean.setName("yaojt");    Gson gson = new Gson();    String StrToJson = gson.toJson(userBean);    System.out.println("序列化操作结果:" + StrToJson);    //序列化操作结果:{"id":10086,"nickName":"yaojt"}    UserBean userFromJson = gson.fromJson(StrToJson, UserBean.class);    System.out.println("反序列化操作结果:" + userFromJson.toString());    //反序列化操作结果:{id:10086, name:yaojt}}public void gsonSandRsTest() {    //基本用法    Gson gson = new Gson();    int age = gson.fromJson("99", int.class);    double weight = gson.fromJson("\"99.99\"", double.class);    boolean female = gson.fromJson("fales", boolean.class);    String name = gson.fromJson("yaojt", String.class);    UserBean userBean = new UserBean();    userBean.setId(11);    userBean.setName("tanksu");    String tojsonResult = gson.toJson(userBean);    System.out.println("序列化成json的结果:" + tojsonResult);    //序列化成json的结果:{"id":11,"nickName":"tanksu"}    String originalStr = "{id:11, nickName:yaojt's-nickName}";    UserBean fromJsonResult = gson.fromJson(originalStr, UserBean.class);    System.out.println("反序列化成string的结果:" + fromJsonResult);    //反序列化成string的结果:{id:11, name:yaojt's-nickName}    String jsarr = "[\"yaojt\",\"tanksu\",\"fishing\"]";    //第二个参数是序列化成String[]数组    String[] strings = gson.fromJson(jsarr, String[].class);    for (int i = 0, count = strings.length; i < count; i++) {        System.out.println("反序列化成string数组,结果(我的所有名字结果):" + strings[i]);    }    /*    反序列化成string数组,结果(我的所有名字结果):yaojt    反序列化成string数组,结果(我的所有名字结果):tanksu    反序列化成string数组,结果(我的所有名字结果):fishing    */}//得到userbean的类型public void gsonTypeToken() throws IOException {    Type type = new TypeToken<UserBean>() {    }.getType();    System.out.println("type:" + type.toString());    //type:class com.yaojt.sdk.java.gsonReflect.UserBean}/** * */public void gsonReflectTest() {    GsonBuilder gsonBuilder = new GsonBuilder();    /* excludeFieldsWithoutExposeAnnotation()函数是用来指明不包括没有被Expose修饰符修饰的字段     * 如果不调用此方法,那么默认bean类里面所有的字段都会被赋值 */    gsonBuilder.excludeFieldsWithoutExposeAnnotation();    Gson gson = gsonBuilder.create();    UserBean userBean = new UserBean();    userBean.setId(1001);    userBean.setName("yaojt");    GsonBean gsonBean = new GsonBean();    gsonBean.setId(12345L);    gsonBean.setDate(new Date());    gsonBean.setUserName("jack");    gsonBean.setAddress("鹅岭南路");    gsonBean.setUserBean(userBean);    String json = gson.toJson(gsonBean);    System.out.println("序列化操作,tojson之后的数据:" + json);    //序列化操作,tojson之后的数据:{"id":12345,"userName":"jack"}    Gson gson1 = new Gson();    json = gson1.toJson(gsonBean);    System.out.println("反序列化操作,tojson之后的数据:" + json);    //反序列化操作,tojson之后的数据:{"id":12345,"userName":"jack","address":"鹅岭南路",    // "date":"Mar 20, 2017 9:22:34 PM","userBean":{"id":1001,"nickName":"yaojt"}}}

}

运行测试用例

我这里用到的是IDE里的单元测试,如果大家多单元测试感兴趣的话,可以去看看这篇文章。链接[http://blog.csdn.net/qq_16628781/article/details/61202111]

@Testpublic void gsonBaseOperattionTest(){    MainGsonReflect gsonReflect = new MainGsonReflect();    gsonReflect.gsonBaseOperattion();}@Testpublic void gsonReflectTest2() {    MainGsonReflect gsonReflect = new MainGsonReflect();    gsonReflect.gsonSandRsTest();}//gson反射测试@Testpublic void gsonReflectTest() {    MainGsonReflect gsonReflect = new MainGsonReflect();    gsonReflect.gsonReflectTest();    try {        gsonReflect.gsonTypeToken();    } catch (IOException e) {        e.printStackTrace();    }}

我在这里附上运行的截图。

gsonBaseOperattionTest()
gsonBaseOperattionTest()

gsonReflectTest2()
gsonReflectTest2()

gsonReflectTest()

gsonReflectTest()

总结

这里主要讲了json的概念,json和XML的区别,还有就是gson的基本操作。内容不难,一看就懂了。后面我会深入的去讲关于gson的一些操作。例如我们自定义解析过程,@expose,@SerializedName等注解的使用。

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

0 0
原创粉丝点击