举例讲解Java的JSON类库GSON的基本用法
GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
其他的json解析库还有json-lib;Jackson;com.alibaba.fastjson
小编还是喜欢Google的Gson。
一、使用场景:
java对象和json字符串的相互转换;日志输出。
例如:
Loggerlogger=Logger.getLogger(CommonAction.class); Gsong=newGson(); logger.info(“return:”+g.toJson(map));
二、用法举例:
1.基础用法toJson
toJason()方法将对象转换成Json字符串
Gsongson=newGson(); Listpersons=newArrayList(); Stringstr=gson.toJson(persons);
2.基础用法:fromJson()
Gson提供了fromJson()方法来实现从Json字符串转化为到java实体的方法。
比如json字符串为:
[{“name”:”name0”,”age”:0}]
则:
Personperson=gson.fromJson(str,Person.class);
提供两个参数,分别是json字符串以及需要转换对象的类型。
3.避免Unicode转义
例如:{"s":"\u003c"}我只想简单的打印成这样{"s":"<"}解决方案:我只需要disableHTMLescaping.Gsongson=new
GsonBuilder().disableHtmlEscaping().create();
4.排除某些字段
如果一个类A中含有字段field1,它的父类也含有字段field1,那么A对象toJson的时候,就会发生declaresmultipleJSONfieldsnamedfield1。解决方案1:在类A中去掉字段filed1.解决方案2:使用Json的@Expose注解将A类MessageText中需要打印的字段filed1加上注解@Expose。那么父类中没有加注解的field1就会被排除掉。
Gsong=newGsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
5.换属性名字
三、使用示例:
importjava.lang.reflect.Type;
importjava.sql.Timestamp;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
importcom.google.gson.Gson;
importcom.google.gson.GsonBuilder;
importcom.google.gson.JsonDeserializationContext;
importcom.google.gson.JsonDeserializer;
importcom.google.gson.JsonElement;
importcom.google.gson.JsonParseException;
importcom.google.gson.JsonPrimitive;
importcom.google.gson.JsonSerializationContext;
importcom.google.gson.JsonSerializer;
importcom.google.gson.reflect.TypeToken;
publicclassGSonDemo{
publicstaticvoidmain(String[]args){
//Gsongson=newGson();
//设置将类型的属性进行格式转换
Gsongson=newGsonBuilder().registerTypeAdapter(Timestamp.class,newTimestampTypeAdapter()).setDateFormat("yyyy-MM-ddHH:mm:ss").create();
List<Person>persons=newArrayList<Person>();
for(inti=0;i<10;i++){
Personp=newPerson();
p.setName("name"+i);
p.setAge(i*5);
p.setInsertTime(newTimestamp(System.currentTimeMillis()));
persons.add(p);
}
Stringstr=gson.toJson(persons);
System.out.println(str);
List<Person>ps=gson.fromJson(str,newTypeToken<List<Person>>(){}.getType());
for(inti=0;i<ps.size();i++)
{
Personp=ps.get(i);
System.out.println(p.toString());
}
System.out.println(newTimestamp(System.currentTimeMillis()));
}
}
classPerson{
privateStringname;
privateintage;
privateTimestampinsertTime;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicTimestampgetInsertTime(){
returninsertTime;
}
publicvoidsetInsertTime(TimestampinsertTime){
this.insertTime=insertTime;
}
@Override
publicStringtoString(){
returnname+"\t"+age+"\t"+insertTime;
}
}
//实现序列化,反序列化接口
classTimestampTypeAdapterimplementsJsonSerializer<Timestamp>,JsonDeserializer<Timestamp>{
publicJsonElementserialize(Timestampsrc,Typearg1,JsonSerializationContextarg2){
DateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss:SS");
StringdateFormatAsString=format.format(newDate(src.getTime()));
returnnewJsonPrimitive(dateFormatAsString);
}
publicTimestampdeserialize(JsonElementjson,TypetypeOfT,JsonDeserializationContextcontext)throwsJsonParseException{
if(!(jsoninstanceofJsonPrimitive)){
thrownewJsonParseException("Thedateshouldbeastringvalue");
}
try{
DateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss:SS");
Datedate=(Date)format.parse(json.getAsString());
returnnewTimestamp(date.getTime());
}catch(Exceptione){
thrownewJsonParseException(e);
}
}
}