测试GSON

/**
 * 测试gson
 * JSON和对象互相转换
 * eclipse小技巧:Alt+Shift+A进行块选择
 */
package com.test;

import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.JsonDeserializer;
import com.google.gson.reflect.TypeToken;

import java.util.LinkedHashMap;
import java.util.Map;


class Head {
	private String src;
	private String dest;
	private String tradeno;
	private String tradedate;
	
	public Head() {
		src = "";       
		dest = "";      
		tradeno = "";     
		tradedate = "";		
	}

	/**
	 * @return src
	 */
	public String getSrc() {
		return src;
	}

	/**
	 * @param src 要设置的 src
	 */
	public void setSrc(String src) {
		this.src = src;
	}

	/**
	 * @return dest
	 */
	public String getDest() {
		return dest;
	}

	/**
	 * @param dest 要设置的 dest
	 */
	public void setDest(String dest) {
		this.dest = dest;
	}

	/**
	 * @return tradeno
	 */
	public String getTradeno() {
		return tradeno;
	}

	/**
	 * @param tradeno 要设置的 tradeno
	 */
	public void setTradeno(String tradeno) {
		this.tradeno = tradeno;
	}

	/**
	 * @return tradedate
	 */
	public String getTradedate() {
		return tradedate;
	}

	/**
	 * @param tradedate 要设置的 tradedate
	 */
	public void setTradedate(String tradedate) {
		this.tradedate = tradedate;
	}

	/* (非 Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "src=" + this.src + ",desc=" + this.dest + "," +
				"tradeno=" + this.tradeno + ",tradedate=" + this.tradedate;
	}	

}

/**
 * 对象序列化JSON串适配器
 *
 */
class HeadToJson implements JsonSerializer<Head> {

	/* (非 Javadoc)
	 * @see com.google.gson.JsonSerializer#serialize(java.lang.Object, java.lang.reflect.Type, com.google.gson.JsonSerializationContext)
	 * JsonElement四个已知子类:  JsonArray, JsonNull, JsonObject, JsonPrimitive
	 */
	@Override
	public JsonElement serialize(Head head, Type typeOfHead, JsonSerializationContext context) {
		// TODO 自动生成的方法存根。可以在这里检查对象中数据是否符合约束
		
		if (null == head) {
			return null;
		} else {
			JsonObject jsonObject = new JsonObject();
			// 添加属性
			jsonObject.addProperty("src", head.getSrc());
			jsonObject.addProperty("dest", head.getDest());
			jsonObject.addProperty("tradeno", head.getTradeno());
			jsonObject.addProperty("tradedate", head.getTradedate());
			// 返回
			return jsonObject;
		}
		
	}
	
}

/**
 * JSON串反序列化对象适配器
 *
 */
class JsonToHead implements JsonDeserializer<Head> {

	/* (非 Javadoc)
	 * @see com.google.gson.JsonDeserializer#deserialize(com.google.gson.JsonElement, java.lang.reflect.Type, com.google.gson.JsonDeserializationContext)
	 */
	@Override
	public Head deserialize(JsonElement jsonElement, Type typeOfHead, JsonDeserializationContext context) throws JsonParseException {
		// TODO 自动生成的方法存根。可以在这里检查数据串中数据是否符合约束
		final JsonObject jsonObject = jsonElement.getAsJsonObject();
		 
	    final String src = jsonObject.get("src").getAsString();
	    final String dest = jsonObject.get("dest").getAsString();
	    final String tradeno = jsonObject.get("tradeno").getAsString();
	    final String tradedate = jsonObject.get("tradedate").getAsString();
	    final Head head = new Head();
	    head.setSrc(src);
	    head.setDest(dest);
	    head.setTradeno(tradeno);
	    head.setTradedate(tradedate);
	    
	    return head;
	}
	
}

public class TestGson {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println("Test Gson...");
		
		exchageMapToJson();
		exchangeObjToJson();		
	}
	
	public static void exchangeObjToJson() {
		System.out.println("对象生成JSON数据串...");
		
		// 数据对象信息
		Head head = new Head();
		head.setSrc("00");
		head.setDest("A0");
		head.setTradeno("1");
		head.setTradedate("20180408105501");
		/**
		 * registerTypeAdapter(Type type, Object typeAdapter)
		 * type-正在注册的类型适配器的类型定义
		 * typeAdapter——这个对象必须至少实现一个typeAdapter、InstanceCreator、JsonSerializer和json序列化器接口。		
		 */
		Gson gson = new GsonBuilder().registerTypeAdapter(Head.class, new HeadToJson()).enableComplexMapKeySerialization().create();
		String s = gson.toJson(head);
		System.out.println(s);
		
		// JSON数据串生成对象
		System.out.println("JSON数据串生成对象...");
		String srcJson = "{\"src\":\"00\",\"dest\":\"A0\",\"tradeno\":\"123456\",\"tradedate\":\"20180408105501\"}";
		if (isJsonStyle(srcJson)) {
			Gson gson1 = new GsonBuilder().registerTypeAdapter(Head.class, new JsonToHead()).enableComplexMapKeySerialization().create();
			Head srcHead = gson1.fromJson(srcJson, Head.class);
			System.out.println(srcHead.toString());
		} else {
			System.out.println("不合理的JSON数据串...");
		}
	}
	
	public static void exchageMapToJson() {
		System.out.println("Map对象和JSON互转...");
		Map<String, String> map = new LinkedHashMap<String, String>();
		map.clear();
		map.put("src", "A0");
		
		// Map转JSON
		// 序列化Map类型的对象时,如果Key是复杂数据类型(不是基本数据类型或者String,即自定义POJO),
		// 此时就要使用enableComplexMapKeySerialization配置选项,
		// 否则Gson默认是以Key.toString()作为JSON字符串对应的Key 
		Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
		String s = gson.toJson(map, map.getClass());
		System.out.println(s);
		
		// Json转Map
		System.out.println("JSON数据串生成Map...");
		String srcJson = "{\"src\":\"00\",\"dest\":\"A0\",\"tradeno\":\"123456\",\"tradedate\":\"20180408105501\"}";
		if (isJsonStyle(srcJson)) {
			Gson gson1 = new GsonBuilder().registerTypeAdapter(Head.class, new JsonToHead()).enableComplexMapKeySerialization().create();
			// com.google.gson.reflect.TypeToken。
			// 这里 new TypeToken<Collection<Integer>>(){}创建了一个继承自TypeToken的匿名内部类的实例,在它的内部通过以下代码就能获取父类的泛型参数。
			Map<String, String> destMap = gson1.fromJson(srcJson,  new TypeToken<LinkedHashMap<String, String>>(){}.getType());
			System.out.println(destMap.toString());
		} else {
			System.out.println("不合理的JSON数据串...");
		}
	}
	
	/**
	 * 判断是否合理的JSON格式语句
	 * @param value  String类型,需要判断的字符串
	 * @return  合理JSON格式返回true否则返回false
	 */
	public static boolean isJsonStyle(final String value) {
		JsonParser jsonParser = new JsonParser();
		try {
			JsonElement jsonElement = jsonParser.parse(value);
			return jsonElement.isJsonObject();  // 返回是否JSON格式的字符串
		} catch(JsonParseException ex) {
			ex.getMessage();
			return false;
		}
		
	}
	
	
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值