/**
* 测试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;
}
}
}
测试GSON
最新推荐文章于 2024-09-20 10:40:49 发布