Android之gson操作系列1

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;
}

@Override
public String toString() {
    return "{" +
            "id:" + id +
            ", name:" + name +
            "}";
}}

GsonBean.java

@Expose
private long id;
@Expose
private 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]

@Test
public void gsonBaseOperattionTest(){
    MainGsonReflect gsonReflect = new MainGsonReflect();
    gsonReflect.gsonBaseOperattion();
}

@Test
public void gsonReflectTest2() {
    MainGsonReflect gsonReflect = new MainGsonReflect();
    gsonReflect.gsonSandRsTest();
}

//gson反射测试
@Test
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值