Android之gson操作系列1
文章链接:http://blog.csdn.net/qq_16628781/article/details/64246167
知识点:
- json的简介;
- json和XML的异同;
- gson的基本操作和@Expose注解的使用说明;
- 新名词记录{@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()
gsonReflectTest2()
gsonReflectTest()
总结
这里主要讲了json的概念,json和XML的区别,还有就是gson的基本操作。内容不难,一看就懂了。后面我会深入的去讲关于gson的一些操作。例如我们自定义解析过程,@expose,@SerializedName等注解的使用。
如有任何问题,请及时与我联系。谢谢!