Gson是google提供的Json解析工具包,提供Json和Java对象之间的转化功能,效率较其他解析工具要快一些。
以下列出Json格式分别与数组、集合、对象间互相转换的sample。
代码如下:
package com.felix.gson;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* Gson的使用小结: Array--Json、List--Json、Map--Json、Object--Json
*
* @author JiHongfei
*/
public class Main {
private static Gson g;
private static int type = 3;//define by yourself
private final static int ARRAY = 0;
private final static int LIST = 1;
private final static int MAP = 2;
private final static int OBJECT = 3;
public static void main(String[] args) {
g = new Gson();
switch (type) {
case ARRAY:
testArray();
break;
case LIST:
testList();
break;
case MAP:
testMAP();
break;
case OBJECT:
testOBJECT();
break;
}
}
/**
* 对象与Json格式间转换
*/
private static void testOBJECT() {
Person person = new Person("小龙女", "古墓", 18);
String jsonString = g.toJson(person);
System.out.println("jsonString of Person is: " + jsonString);
Person fromJson = g.fromJson(jsonString, Person.class);
System.out.println("Person of jsonString is: " + fromJson);
}
private static class Person {
public Person(String name, String address, int age) {
super();
this.name = name;
this.address = address;
this.age = age;
}
public String name;
public String address;
public int age;
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", age="
+ age + "]";
}
}
/**
* Map集合与Json格式间转换
*/
private static void testMAP() {
Map<String, Integer> map = new HashMap<String, Integer>();// 存入是无序的,因此不一定按照put的顺序遍历出来
map.put("张三", 20);
map.put("李四", 22);
map.put("王五", 24);
String jsonString = g.toJson(map);
System.out.println("jsonString of map is: " + jsonString);
Type type = new TypeToken<HashMap<String, Integer>>() {
}.getType();
Map<String, Integer> fromJson = g.fromJson(jsonString, type);
Set<Entry<String, Integer>> entrySet = fromJson.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("the key of map is: " + entry.getKey());
}
}
/**
* List集合与Json格式间转换
*/
private static void testList() {
ArrayList<String> list = new ArrayList<String>();
list.add("淘宝");
list.add("京东");
list.add("亚马逊");
String jsonString = g.toJson(list);
System.out.println("jsonString of list is: " + jsonString);
// TypeToken的使用,获得带泛型信息的type
Type type = new TypeToken<ArrayList<String>>() {
}.getType();
ArrayList<String> fromJson = g.fromJson(jsonString, type);
for (int i = 0; i < list.size(); i++) {
System.out.println("element" + i + " of list is: "
+ fromJson.get(i));
}
}
/**
* 数组与Json格式间转换
*/
private static void testArray() {
String arr[] = new String[] { "Monday", "Tuesday", "Friday" };
String jsonString = g.toJson(arr);
System.out.println("jsonString of arr[] is: " + jsonString);
String[] fromJson = (String[]) g.fromJson(jsonString, String[].class);
for (int i = 0; i < fromJson.length; i++) {
System.out.println("arr[" + i + "] is: " + fromJson[i]);
}
}
}<strong>
</strong>
jsonString of Person is: {"name":"小龙女","address":"古墓","age":18}
Person of jsonString is: Person [name=小龙女, address=古墓, age=18]
Map集合与Json格式间转换结果
jsonString of map is: {"李四":22,"张三":20,"王五":24}
the key of map is: 李四
the key of map is: 张三
the key of map is: 王五
List集合与Json格式间转换结果
jsonString of list is: ["淘宝","京东","亚马逊"]
element0 of list is: 淘宝
element1 of list is: 京东
element2 of list is: 亚马逊
数组与Json格式间转换结果
jsonString of arr[] is: ["Monday","Tuesday","Friday"]
arr[0] is: Monday
arr[1] is: Tuesday
arr[2] is: Friday
注意
由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。因此借助了TypeToken获得携带泛型的类型。
详见 :“Gson通过借助TypeToken获取泛型参数的类型的方法” http://www.blogjava.net/brock/archive/2012/08/01/384520.html