欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

举例讲解Java的JSON类库GSON的基本用法

程序员文章站 2024-03-12 22:25:20
gson这个java类库可以把java对象转换成json,也可以把json字符串转换成一个相等的java对象。gson支持任意复杂java对象包括没有源代码的对象。 其他...

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);
    }
  }

}