json处理三部曲之第三曲:利用Gson处理json
需要导入gson-xxx.jar包
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.0</version> </dependency>
常用的类有三个:com.google.gson.JsonElement抽象类及其两个子类com.google.gson.JsonObject 和 com.google.gson.JsonArray
发挥做用的也就两个方法:
Gson gson=new Gson();
String jsonStr=gson.toJson(Object src) ;//可以传普通JavaBean、Map<String,Object>、List<JavaBean>、List<Object>
T gson.fromJson(String json, Class<T> classOfT) //可以把json字符串转为普通JavaBean
1.普通JavaBean与json字符串及JsonObject互转:
@Test
public void testBeanJSON() {
Gson gson = new Gson();
Person person = new Person();
person.setId(1);
person.setName("zhangsan");
person.setEmail("zhangsan@126.com");
// 把JavaBean转为json字符串
String json = gson.toJson(person);
System.out.println(json);
// 把json字符串转为JavaBean
person = gson.fromJson(json, Person.class);
System.out.println(person);
// 把json字符串转为JsonObject
JsonObject jsonObject = (JsonObject) gson.fromJson(json, JsonElement.class);
System.out.println(jsonObject);
String jsonStr = jsonObject.toString();
System.out.println(jsonStr.equals(json));
JsonPrimitive nameJsonPrimitive = (JsonPrimitive) jsonObject.get("name");
System.out.println(nameJsonPrimitive);
String name = nameJsonPrimitive.getAsString();
System.out.println(name);
}
//打印结果:
//{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
//Person [id=1, name=zhangsan, email=zhangsan@126.com]
//{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
//true
//"zhangsan"
//zhangsan
把json字符串转成JavaBean时,fromJson第二个参数传的是Entity.class;
把json字符串转换成JsonObject时,fromJson第二个参数传的是JsonElement.class,不能传JsonObject.class,否则返回的JsonObject是空的JsonObject对象。
如果想得到JsonObject对象的某个属性值,要调用两个级联方法.get(String memberName).getAsString()。
2.Map与json字符串互转:
@Test
public void testMapJSON() {
Gson gson = new Gson();
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("name", "zhangsan");
map.put("ema", "zhangsan@126.com");
String json = gson.toJson(map);
System.out.println(json);
map = gson.fromJson(json, Map.class);
System.out.println(map);
System.out.println(map.get("id"));
System.out.println(map.get("id").getClass().getName());
}
//打印结果:
//{"name":"zhangsan","ema":"zhangsan@126.com","id":1}
//{name=zhangsan, ema=zhangsan@126.com, id=1.0}
//1.0
//java.lang.Double
值得注意的是,原来map中id键对应的值类型是int,但是转成json字符串再转回来后,int类型变为Double类型了,这值得重视。如果需要int型,还需要利用double.intValue()方法转为int型。
3.List<Object>或List<JavaBean>与json字符串互转:
@Test
public void testListJson() {
// List<Object>与Json互转
List<Object> list = new ArrayList<Object>();
for (int i = 0; i < 2; i++) {
list.add(i);
list.add("element" + i);
}
System.out.println(list);
Gson gson = new Gson();
String json = gson.toJson(list);
System.out.println(json);
list = gson.fromJson(json, List.class);
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
System.out.println(o);
System.out.println(o.getClass().getName());
}
// List<JavaBean>与Json互转
List<Person> PersonList = new ArrayList<Person>();
for (int i = 1; i < 3; i++) {
Person person = new Person();
person.setId(i);
person.setName("zhangsan" + i);
person.setEmail("zhangsan@126.com" + i);
PersonList.add(person);
}
String PersonJsonStr = gson.toJson(PersonList);
System.out.println(PersonJsonStr);
List<LinkedHashMap<String, Object>> list2 = gson.fromJson(PersonJsonStr, List.class);
System.out.println(list2);
for (LinkedHashMap<String, Object> l : list2) {
System.out.println(l.getClass().getName());
Double doubleId = (Double) l.get("id");
int intId = doubleId.intValue();
System.out.println(intId);
}
// 利用TypeToken,List<JavaBean>与Json互转
Type type = new TypeToken<List<Person>>() {
}.getType();
System.out.println("type: " + type);
String PersonJsonStr2 = gson.toJson(PersonList, type);
System.out.println(PersonJsonStr2.equals(PersonJsonStr));
List<Person> users = gson.fromJson(PersonJsonStr, type);
System.out.println(users);
}
}
/*
[0, element0, 1, element1]
[0,"element0",1,"element1"]
0.0
java.lang.Double
element0
java.lang.String
1.0
java.lang.Double
element1
java.lang.String
[{"id":1,"name":"zhangsan1","email":"zhangsan@126.com1"},{"id":2,"name":"zhangsan2","email":"zhangsan@126.com2"}]
[{id=1.0, name=zhangsan1, email=zhangsan@126.com1}, {id=2.0, name=zhangsan2, email=zhangsan@126.com2}]
java.util.LinkedHashMap
1
java.util.LinkedHashMap
2
type: java.util.List<com.maizuo.entiti.Person>
true
[Person [id=1, name=zhangsan1, email=zhangsan@126.com1], Person [id=2, name=zhangsan2, email=zhangsan@126.com2]]
*/
经过实际测试知,不管是转换List<Object>还是List<JavaBean>,当把字符串反序列化为list时,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数必需传List.class,
当转换List<JavaBean>时,有2种方法:
第一种方法,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数传List.class。此时,返回的list中的元素不是JavaBean,而是Map,具体来说是java.util.LinkedHashMap类型的。所以如果想得到一个个JavaBean,还需从Map中取出键值对,然后利用构造器封装成JavaBean。
第二种方法,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数传Type对象(Type type = new TypeToken<List<Person>>() {
}.getType(); //写法好怪,不必强记,记住有这回事就好)。此时 ,返回的List对象的元素就是JavaBean对象。
实际用哪种反序列化方法,看具体需求。
4.数组与json字符串互转:
@Test
public void testArrayJson() {
// 将数组转JSON
int[] number = { 1, 2, 3, 4, 5 };
Gson gson = new Gson();
String numberjson = gson.toJson(number);
System.out.println(numberjson);
// 将JSON转数组
number = gson.fromJson(numberjson, int[].class);
for (int i = 0; i < number.length; i++) {
System.out.println("第" + (i + 1) + "个值是: " + number[i]);
}
}
/*
打印结果:
[1,2,3,4,5]
第1个值是: 1
第2个值是: 2
第3个值是: 3
第4个值是: 4
第5个值是: 5
*/
json处理三部曲之第三曲:利用Gson处理json的更多相关文章
- 利用Gson将JSON数据进行格式化(pretty print)
我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonPa ...
- json处理三部曲之第一曲:利用json-lib-xxx.jar处理json
json-lib-xxx.jar包必需5个依赖包(实测): ezmorph-xxx.jar commons-lang-xxx.jar commons-beanutils-xxx.jar commons ...
- Android 利用 gson 将 json 转成 对象object 集合list
1.build.gradle 中引入gson compile 'com.google.code.gson:gson:2.8.5' 2.将后台返回的json数据转对象.List.时间格式与后台返回的时间 ...
- Java 利用Gson将json字符串转换为List<Map<String, String>>
json字符串类似于: [ { "userPhone": "123", "userNo": "123-2", " ...
- Android 利用Gson生成或解析json
目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https://code.google.com/p/google-gson/ 下载的放在lib并导入,若 ...
- Amdroid示例:利用Gson生成或解析json
转自:http://www.cnblogs.com/liqw/p/4266209.html 目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https: ...
- Gson解析json数据
1.解析单个对象 JSON字符串如下 [ { "formatDate":"2015-10-28", "date":"2015\u5 ...
- 解析JSON有俩种方式:JSONObject和GSON
JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...
随机推荐
- 面试题-Java Web-Servlet部分
1.什么是Servlet? Servlet是用来处理客户端请求并产生动态网页内容的Java类.Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状 ...
- vga显示彩条
vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...
- foreach绑定
目的 foreach可以将一个数组中的实体循环的进行绑定.这在将一个list显示成table时非常有用. 假设数组是observable的,当在绑定后做了add, remove,或者重新排序后,绑定会 ...
- CentOS 7.0 64位 安装TFTP
1.安装tftp软件# yum -y install tftp*2.修改配置文件 # vi /etc/xinetd.d/tftp server_args = -s /tftpboot '加-cdisa ...
- OpenWRT编译记录--TPLINK_WR841ND_V7
之前自己编译OpenWRT的一些记录,现在搬上来.简单介绍了编译环境的准备,编译过程,以及一些注意事项. 准备工作 本人是在Ubuntu环境下编辑的,首先安装编译所需要的组件包: sudo apt-g ...
- 修改虚拟机内容导致oracle不能启动
虚拟机内存目前设置为4G,想要改变成2G,数据库启动时导致报targetmomory错误,解决办法如下: 1.查看分配的memory_target和memory_max_target大小 SQL> ...
- HDU:3368-Reversi(暴力枚举)
Reversi Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- NewtonJson中转义的斜杠\和多余的引号处理
使用newtonjson序列化的json串正常的,但通过网络传输后,会再包装一层引号和对原有定义引号的转义,最后结果就变成这种数据: “\"{\\\"State\":fa ...
- ubuntu 14.04 opencv2.4.13 安装
1.下载然后解压安装压缩包 unzip opencv-2.4.13.zip 2. 进入刚解压的文件夹,建立release文件夹 cd opencv-2.4.13 mkdir release 3. 安装 ...
- 正向代理vs.反向代理
正向代理 也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...