JavaDemo——Gson操作json

参考:http://www.importnew.com/16630.html,http://www.javacreed.com/gson-deserialiser-example/

工作需要用到json,查阅了一下,选择了GoogleGson,可能会比阿里巴巴的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;
	}
}
记录一下,以后可能会用得着。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值