参考:http://www.importnew.com/16630.html,http://www.javacreed.com/gson-deserialiser-example/
工作需要用到json,查阅了一下,选择了Google的Gson,可能会比阿里巴巴的fastjson慢点,但对复杂对象比较友好。
写了几个demo学习下;
maven工程pom.xml添加(代码使用的是jdk9)
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
1.简单使用
GsonTest.java代码
/**
* createtime : 2018年1月12日 上午9:52:20
*/
package com.jsontest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
/**
* TODO
* @author XWF
*/
public class GsonTest {
/**
* @param args
* @throws IOException
* @throws JsonIOException
*/
public static void main(String[] args) throws JsonIOException, IOException {
//基本转换
System.out.println("=========基本转换=========");
Gson gson = new Gson();
Student stu = new Student(22,"小明");
String json = gson.toJson(stu);
Student newStu = gson.fromJson(json, Student.class);
System.out.println("newStu:"+newStu.getAge()+";"+newStu.getName());
System.out.println();
//list,set类型
System.out.println("=========List类型=========");
List<String> list = new ArrayList<>();
list.add("aaaaa");
list.add("bbb");
list.add("cc");
String listjson = gson.toJson(list);
System.out.println("listjson:"+listjson);
List<String> newlist = gson.fromJson(listjson, new TypeToken<List<String>>() {}.getType());
System.out.println("newlist:"+newlist);
System.out.println();
//获取属性
System.out.println("=========获取属性=========");
JsonObject jo = new JsonParser().parse(json).getAsJsonObject();
System.out.println(jo.get("name").toString());
System.out.println(jo.toString());
System.out.println();
//删除属性
System.out.println("=========删除属性=========");
jo.remove("age");
System.out.println(jo.toString());
System.out.println();
//添加属性
System.out.println("=========添加属性=========");
jo.addProperty("newage", 44);
System.out.println(jo.toString());
System.out.println();
//判断属性
System.out.println("=========判断属性=========");
System.out.println("是否有newage属性:"+jo.has("newage"));
System.out.println("是否有age属性:"+jo.has("age"));
System.out.println();
//日期格式化
System.out.println("=========日期格式========");
GsonBuilder gb = new GsonBuilder();
gb.setDateFormat("yyyy年MM月dd日 HH:mm:ss");
Gson dategson = gb.create();
List<Date> datelist = new ArrayList<>();
datelist.add(new Date());
dategson.toJson(datelist,System.out);
System.out.println();
//输出文件
System.out.println("=========写入文件========");
Writer w = new FileWriter("student.json");
gson.toJson(stu,w);
w.close();
System.out.println();
//读入文件
System.out.println("=========读取文件========");
Reader reader = new InputStreamReader(new FileInputStream(new File("otherstudent.json")));
NewStu4Json newStu4Json = gson.fromJson(reader, NewStu4Json.class);
System.out.println(newStu4Json.toString());
System.out.println();
//嵌套类型
System.out.println("=========嵌套类型========");
String classJson = "{'className':'二班','students':[{'aGe':33,'NaMe':'无名','Address':'中国'},{'aGe':21,'NaMe':'有名','Address':'外国'}]}";
MyClass myclass = gson.fromJson(classJson,MyClass.class);
System.out.println(myclass.toString());
System.out.println();
}
}
class Student{
private int age;
private String name;
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class NewStu4Json{
private int aGe;//必须一致,大小写敏感
private String NaMe;
private String Address;
//忽略了other属性
public NewStu4Json() {
}
public int getaGe() {
return aGe;
}
public void setaGe(int aGe) {
this.aGe = aGe;
}
public String getNaMe() {
return NaMe;
}
public void setNaMe(String naMe) {
NaMe = naMe;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
@Override
public String toString() {
return "年龄:"+aGe+";名字:"+NaMe+";地址:"+Address;
}
}
class MyClass{
private String className;
private NewStu4Json[] students;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public NewStu4Json[] getStudents() {
return students;
}
public void setStudents(NewStu4Json[] students) {
this.students = students;
}
@Override
public String toString() {
List<String> namelist = Arrays.asList(students).stream().map(v -> v.getNaMe()).collect(Collectors.toList());
return "班级:"+className+";学生:"+namelist;
}
}
生成的student.json
{"age":22,"name":"小明"}
读取用的otherstudent.json
{"aGe":33,"NaMe":"无名","Address":"中国","other":"nothing"}
2.使用自定义的Deserializer
/**
* createtime : 2018年1月12日 下午3:33:13
*/
package com.jsontest;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
/**
* TODO
* @author XWF
*/
public class GsonJsonDeserializerTest {
/**
* @param args
*/
public static void main(String[] args) {
String json1 = "{'str':'hello','int-x':'123','int-y':'456',"
+ "'people':[{'id':'1','name':'tom'},{'id':'2','name':'jerry'}]}";
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(MyJson1.class, new MyJson1Deserializer());//注册反序列化器
gb.registerTypeAdapter(People.class, new MyPeopleDeserializer());
Gson gson = gb.create();
MyJson1 myJson1 = gson.fromJson(json1, MyJson1.class);
System.out.println(myJson1.toString());
}
}
class MyJson1{
private String str;
private int intX;//无法用int-x,非法命名规则
private int intY;
private People[] peoples;
public People[] getPeoples() {
return peoples;
}
public void setPeoples(People[] peoples) {
this.peoples = peoples;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getIntX() {
return intX;
}
public void setIntX(int intX) {
this.intX = intX;
}
public int getIntY() {
return intY;
}
public void setIntY(int intY) {
this.intY = intY;
}
@Override
public String toString() {
List<String> peopleToString = Arrays.asList(peoples).stream().map(v -> v.toString()).collect(Collectors.toList());
return "str="+str+"; intX="+intX+"; intY="+intY+"; peoples="+peopleToString;
}
}
class People{
private int id;
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+":"+name+">";
}
}
class MyJson1Deserializer implements JsonDeserializer<MyJson1>{
@Override
public MyJson1 deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String str = jsonObject.get("str").toString();
int intx = jsonObject.get("int-x").getAsInt();
int inty = jsonObject.get("int-y").getAsInt();
People[] peopleArray = context.deserialize(jsonObject.get("people"), People[].class);
MyJson1 mj1 = new MyJson1();
mj1.setStr(str);
mj1.setIntX(intx);
mj1.setIntY(inty);
mj1.setPeoples(peopleArray);
return mj1;
}
}
class MyPeopleDeserializer implements JsonDeserializer<People>{
@Override
public People deserialize(JsonElement json, Type peopleType, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
int peopleId = jsonObject.get("id").getAsInt();
String peopleName = jsonObject.get("name").toString();
People p = new People();
p.setId(peopleId);
p.setName(peopleName);
return p;
}
}
3.使用对象引用
/**
* createtime : 2018年1月13日 上午9:59:47
*/
package com.jsontest;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
/**
* TODO
* @author XWF
*/
public class GsonReferenceTest {
/**
* @param args
*/
public static void main(String[] args) {
String str = "{'shops':[{'shopname':'hello','sellfood':[1,2]},{'shopname':'world','sellfood':[2]}],'foods':[{'foodid':'1','foodname':'apple'},{'foodid':'2','foodname':'orange'}]}";
GsonBuilder gsonbuilder = new GsonBuilder();
gsonbuilder.registerTypeAdapter(Food.class, new FoodDeserializer());
gsonbuilder.registerTypeAdapter(Shop.class, new ShopDeserializer());
gsonbuilder.registerTypeAdapter(Info.class, new InfoDeserializer());
Gson gson = gsonbuilder.create();
Info info = gson.fromJson(str, Info.class);
Shop[] shops = info.getShops();
for(Shop shop:shops) {
System.out.println("商店 "+shop.getShopName());
for(Food food:shop.getSellFoods()) {
System.out.println("\t卖 "+food.toString());
}
}
}
}
class Food{
private int foodId;
private String foodName;
public int getFoodId() {
return foodId;
}
public void setFoodId(int foodId) {
this.foodId = foodId;
}
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
@Override
public String toString() {
return "id:"+foodId+";foodName:"+foodName;
}
}
class Shop{
private String shopName;
private Food[] sellFoods;
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public Food[] getSellFoods() {
return sellFoods;
}
public void setSellFoods(Food[] sellFoods) {
this.sellFoods = sellFoods;
}
}
class Info{
private Shop[] shops;
private Food[] foods;
public Shop[] getShops() {
return shops;
}
public void setShops(Shop[] shops) {
this.shops = shops;
}
public Food[] getFoods() {
return foods;
}
public void setFoods(Food[] foods) {
this.foods = foods;
}
@Override
public String toString() {
return super.toString();
}
}
class FoodDeserializer implements JsonDeserializer<Food>{
private final ThreadLocal<Map<Integer, Food>> cache = new ThreadLocal<Map<Integer, Food>>() {
@Override
protected Map<Integer, Food> initialValue() {
return new HashMap<>();
}
};
@Override
public Food deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
//是基本数据类型(布尔,整形,单双浮点,字节,字符,字符串)
//处理shop里sellfood的id用
if(jsonElement.isJsonPrimitive()) {
JsonPrimitive jp = jsonElement.getAsJsonPrimitive();
return getOrCreate(jp.getAsInt());//通过id获得map里的food
}
//处理foods生成food对象
if(jsonElement.isJsonObject()) {
JsonObject jsonObj = jsonElement.getAsJsonObject();
Food food = getOrCreate(jsonObj.get("foodid").getAsInt());//通过id获得map里的food
food.setFoodName(jsonObj.get("foodname").getAsString());//给map里的food赋值name
return food;
}
throw new JsonParseException("Unexpected JSON type: " + jsonElement.getClass().getSimpleName());
}
//获得food
private Food getOrCreate(int id) {
Food food = cache.get().get(id);
if(null == food) {//如果map里没有,就新建一个只有id的food对象
food = new Food();
food.setFoodId(id);
cache.get().put(id, food);
}
return food;
}
}
class ShopDeserializer implements JsonDeserializer<Shop>{
@Override
public Shop deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("shopname").getAsString();
Food[] foods = context.deserialize(jsonObject.get("sellfood"), Food[].class);//使用id获得
Shop shop = new Shop();
shop.setShopName(name);
shop.setSellFoods(foods);
return shop;
}
}
class InfoDeserializer implements JsonDeserializer<Info>{
@Override
public Info deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
JsonObject jo = arg0.getAsJsonObject();
Shop[] shops = arg2.deserialize(jo.get("shops"), Shop[].class);
Food[] foods = arg2.deserialize(jo.get("foods"), Food[].class);//使用完整数据获得
Info info = new Info();
info.setShops(shops);
info.setFoods(foods);
return info;
}
}
记录一下,以后可能会用得着。