举例讲解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); } } }