(五)Google Gson包的使用

1.简介

Gson包中,使用最多的是Gson类的toJson()和fromJson()方法:
        ①toJson():将java对象转化为json数据(一般为json格式的字符串)  (序列化)
        ②fromJson():从json数据(json格式字符串)转为java对象   (反序列化)
也可以使用JsonObject和JsonArray类的无参构造函数创建实例,然后调用add()方法来构造json数据,用法与org.json包和json-lib包差不多,但却少了一些方法;这里使用Gson包还是推荐使用Gson类的toJson()和fromJson()方法。
Github上的原话:
Gson Goals:
  • Provide simple toJson() and fromJson() methods to convert Java objects to JSON and vice-versa
  • Allow pre-existing unmodifiable objects to be converted to and from JSON
  • Extensive support of Java Generics
  • Allow custom representations for objects
  • Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)

各个版本的下载地址:http://www.mvnrepository.com/artifact/com.google.code.gson/gson

2.json与简单数据类型、数组

例子:
 package gson;
import com.google.gson.Gson;
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
// 简单数据类型 转为 json
String intStr = gson.toJson(1);
String stringStr = gson.toJson("abcd");
String longStr = gson.toJson(new Long(10));
System.out.println(intStr); // int
System.out.println(stringStr); // String
System.out.println(longStr); // Long
// json 转为 简单数据类型
int id1 = gson.fromJson("1", int.class);
Integer id2 = gson.fromJson("1", Integer.class);
Boolean boolean1 = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
System.out.println(id1);
System.out.println(id2);
System.out.println(boolean1);
System.out.println(str); // java array 转为 json
String[] strings = { "abc", "def", "ghi" };
int[][] intInt = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
String stringStrs = gson.toJson(strings); // String数组转为json
String intIntStr = gson.toJson(intInt); // 多维数据转为json
System.out.println(stringStrs);
System.out.println(intIntStr);
//json 转为 java array
String[] strings2 = gson.fromJson(stringStrs, String[].class);
int[][] intInt2 = gson.fromJson(intIntStr, int[][].class);
for (int i = 0; i < strings2.length; i++) { //输出String[]
System.out.print(strings2[i] + " ");
}
System.out.println();
for (int i = 0; i < intInt2.length; i++) { //输出int[][]
for (int j = 0; j < intInt2[i].length; j++) {
System.out.print(intInt2[i][j] + ",");
}
System.out.print(" ");
}
}
}
输出结果:

3.json与java集合、Map

例子:
 package gson;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
// Map 转 json
Map<string object=""> map = new HashMap<string object="">();
map.put("name", "JTZen9");
map.put("age", 21);
map.put("sex", "male");
String jsonMap = gson.toJson(map);
System.out.println(jsonMap);
// json 转 Map
Type type = new TypeToken<Map<string object="">>() {}.getType();
Map<string object=""> map2 = gson.fromJson(jsonMap, type);
System.out.println(map2.get("name") + " " + map2.get("age") + " " + map2.get("sex")); // java集合 转 json
List<object> nameList = new ArrayList</object><object>();
nameList.add("JTZen9");
nameList.add(map);
nameList.add("DSMGYH");
String jsonNames = gson.toJson(nameList);
System.out.println(jsonNames);
// json 转 java集合
type = new TypeToken<List</object><object>>() {}.getType();
List</object><object> list = gson.fromJson(jsonNames, type);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
}
}
输出结果:

4.json与java beans

        沿用上几篇笔记的Student类:name、age、sex字段以及getter和setter方法。

例子:

 package gson;
import com.google.gson.Gson;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("JTZen9");
student.setAge(21);
student.setSex("male");
Gson gson = new Gson();
// java bean 转 json
String beanStr = gson.toJson(student);
System.out.println(beanStr);
// json 转 java bean
Student student2 = gson.fromJson(beanStr, Student.class);
System.out.println(student2.getName() + " " + student2.getAge() + " " + student2.getSex()); // 转为json数据时,只会转换属性值的字段
Student stu = new Student();
stu.setName("JTZen9");
stu.setAge(21);
String test = gson.toJson(stu);
System.out.println(test); //没有sex字段
}
}
输出结果:
json-lib包中,JSONObject.fromObject()构造的json数据,全部的字段都包含,没有赋值的都为空;
Gson包的toJson()方法和org.json包的new JSONObject()方法,转换java bean为json数据时,只会转换有赋值的字段。
 

5.解析json数据

json数据如下:

 {
"roomname":[
{
"PCnum":0,
"num":2,
"name":"biubiubiu",
"time":"十二月 18, 2015"
},
{
"PCnum":0,
"num":1,
"name":"jtz",
"time":"十二月 19, 2015"
},
{
"PCnum":0,
"num":1,
"name":"jtzeng",
"time":"十二月 19, 2015"
} ]
}
使用JsonObject和JsonArray的配合来使用也是可以解析的,但是这样解析起来就比较麻烦,当json数据又多又复杂时候更是麻烦,所以这里有一种简单的方法,首先定义一个对应json数据字段的java类:
 package gson;
import java.util.List;
public class JsonBean {
public List<roomdata> roomname;
public class RoomData {
public int PCnum;
public int num;
public String name;
public String time;
}
}
然后,测试如下:
 package gson;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class Test {
public static void main(String[] args) {
//要解析json数据
String json = "{'roomname':[{'PCnum':0,'num':2,'name':'biubiubiu','time':'Dec 22, 2015'},"
+ "{'PCnum':0,'num':1,'name':'jtz','time':'Dec 18, 2015'},"
+ "{'PCnum':0,'num':0,'name':'JTZen9','time':'Dec 22, 2015'}]}";
Gson gson = new Gson();
Type type = new TypeToken<jsonbean>(){}.getType();
JsonBean jsonBean = gson.fromJson(json, type);
System.out.println(jsonBean.roomname.size());
for (int i = 0; i < jsonBean.roomname.size(); i++) {
System.out.println(jsonBean.roomname.get(i).name + " 、 "
+ jsonBean.roomname.get(i).PCnum + " 、 "
+ jsonBean.roomname.get(i).num + " 、 "
+ jsonBean.roomname.get(i).time);
}
}
}
输出的结果如下:
需要注意的是:定义的类中,属性字段名必须跟json数据的key字段名一样。

6.结束语

还有很多的方法没有尝试,往后慢慢积累。

        org.json包、json-lib包、Gson包,终于搞清楚了些,做课程作业时糊里糊涂的。相比之下,感觉Gson挺好用的,往后深入探究探究Gson。

Java创建和解析Json数据方法(五)——Google Gson包的使用的更多相关文章

  1. Java创建和解析Json数据方法(三)——json-lib包的使用

    (三)json-lib包的使用         这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...

  2. Java创建和解析Json数据方法(四)——json-lib包的使用

    (四)json-lib包的使用         既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...

  3. Java创建和解析Json数据方法(二)——org.json包的使用

    (二)org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...

  4. Java创建和解析Json数据方法——org.json包的使用(转)

    org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies, ...

  5. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  6. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  7. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  8. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

  9. java创建和解析json对象

    最近工作遇到了 json 解析的相关需求,整理下 JSONObject 相关操作. 文中使用的例子都是基于阿里巴巴的产品 FastJSON ,涉及到的包有: import com.alibaba.fa ...

随机推荐

  1. MIP启发式算法:local branching

    *本文主要是记录并分享最近学习到的知识,算不上原创 *参考文献见链接 本文主要是讲述local branching算法,主要以M. Fischetti的论文 “Local braching”和Pier ...

  2. UVa 10118 记忆化搜索 Free Candies

    假设在当前状态我们第i堆糖果分别取了cnt[i]个,那么篮子里以及口袋里糖果的个数都是可以确定下来的. 所以就可以使用记忆化搜索. #include <cstdio> #include & ...

  3. UVa 12235 状压DP Help Bubu

    题解戳这 一开始没看懂题解,后来想明白以后,d(i, j, s, x)是考虑第i本书的时候,前面已经拿走了j本书,剩下的书的种类的二进制状态为s,剩下的最后一本书的编号为x,所能得到的最小混乱度. 这 ...

  4. Python 前端 js基础

    Javascript 概述 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的 ...

  5. loj2276 「HAOI2017」新型城市化

    给出的图是一个二分图(显然--吗),一个图的最大团=其补图的最大独立集,因此二分图的最大独立集就是补图的最大团. 欲使补图最大团变大,则要最大独立集变大.二分图最大独立集=点数-最小点覆盖.最小点覆盖 ...

  6. Selenium WebDriver-判断页面中某一元素是否可操作

    driver.get("http://127.0.0.1/test_enable.html") i1=driver.find_element_by_id("input1& ...

  7. 《Python全栈开发指南》第3版 Alex著(LFXC2018)

    第一章 Python基础——Python介绍&循环语句 1.1 编程语言介绍 1.2 Python介绍 1.3 Python安装 1.4 第一个Python程序 1.5 变量 1.6 程序交互 ...

  8. jmeter非常好的博客收藏

    http://blog.sina.com.cn/s/blog_56c9b55c010148os.html

  9. 06-python进阶-多线程下载器练手

    我们需要用python 写一个多线程的下载器 我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来 #!/usr/bin/env python#coding:utf- ...

  10. bat 文件读取乱码问题

    使用 for 循环 type file1.txt > file2.txt 文件读取后可能会出现乱码,需要在 bat 文件中设置 chcp 表示将批处理设置为 utf-8 编码,这样在生成文件和读 ...