举例讲解Java的JSON类库GSON的基本用法
gson这个java类库可以把java对象转换成json,也可以把json字符串转换成一个相等的java对象。gson支持任意复杂java对象包括没有源代码的对象。
其他的json解析库还有json-lib;jackson;com.alibaba.fastjson
小编还是喜欢google的gson。
一、使用场景:
java对象和json字符串的相互转换;日志输出。
例如:
logger logger = logger.getlogger(commonaction.class); gson g = new gson(); logger.info(“return:”+g.tojson(map));
二、用法举例:
1.基础用法tojson
tojason()方法将对象转换成json字符串
gson gson = new gson(); list persons = new arraylist(); string str = gson.tojson(persons);
2.基础用法:fromjson()
gson提供了fromjson()方法来实现从json字符串转化为到java实体的方法。
比如json字符串为:
[{“name”:”name0”,”age”:0}]
则:
person person = gson.fromjson(str, person.class);
提供两个参数,分别是json字符串以及需要转换对象的类型。
3.避免unicode转义
例如: {"s":"\u003c"} 我只想简单的打印成这样 {"s":"<"} 解决方案: 我只需要 disable html escaping. gson gson = new
gsonbuilder().disablehtmlescaping().create();
4.排除某些字段
如果一个类a中含有字段field1,它的父类也含有字段field1,那么a对象tojson的时候,就会发生declares multiple json fields named field1。 解决方案1:在类a中去掉字段filed1. 解决方案2:使用json的@expose注解 将a类messagetext中需要打印的字段filed1加上注解@expose 。那么父类中没有加注解的field1就会被排除掉。
gson g = new gsonbuilder().excludefieldswithoutexposeannotation().create();
5.换属性名字
三、使用示例:
import java.lang.reflect.type; import java.sql.timestamp; import java.text.dateformat; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list; 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.jsonparseexception; import com.google.gson.jsonprimitive; import com.google.gson.jsonserializationcontext; import com.google.gson.jsonserializer; import com.google.gson.reflect.typetoken; public class gsondemo { public static void main(string[] args) { // gson gson = new gson(); //设置将类型的属性进行格式转换 gson gson = new gsonbuilder().registertypeadapter(timestamp.class, new timestamptypeadapter()).setdateformat("yyyy-mm-dd hh:mm:ss").create(); list<person> persons = new arraylist<person>(); for (int i = 0; i < 10; i++) { person p = new person(); p.setname("name" + i); p.setage(i * 5); p.setinserttime(new timestamp(system.currenttimemillis())); persons.add(p); } string str = gson.tojson(persons); system.out.println(str); list<person> ps = gson.fromjson(str, new typetoken<list<person>>(){}.gettype()); for(int i = 0; i < ps.size() ; i++) { person p = ps.get(i); system.out.println(p.tostring()); } system.out.println(new timestamp(system.currenttimemillis())); } } class person { private string name; private int age; private timestamp inserttime; public string getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } public timestamp getinserttime() { return inserttime; } public void setinserttime(timestamp inserttime) { this.inserttime = inserttime; } @override public string tostring() { return name + "\t" + age + "\t" + inserttime; } } //实现序列化,反序列化接口 class timestamptypeadapter implements jsonserializer<timestamp>, jsondeserializer<timestamp> { public jsonelement serialize(timestamp src, type arg1, jsonserializationcontext arg2) { dateformat format = new simpledateformat("yyyy-mm-dd hh:mm:ss:ss"); string dateformatasstring = format.format(new date(src.gettime())); return new jsonprimitive(dateformatasstring); } public timestamp deserialize(jsonelement json, type typeoft, jsondeserializationcontext context) throws jsonparseexception { if (!(json instanceof jsonprimitive)) { throw new jsonparseexception("the date should be a string value"); } try { dateformat format = new simpledateformat("yyyy-mm-dd hh:mm:ss:ss"); date date = (date) format.parse(json.getasstring()); return new timestamp(date.gettime()); } catch (exception e) { throw new jsonparseexception(e); } } }
上一篇: itchat入门