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

 更新时间:2016年06月22日 12:08:26   作者:云栖社区  
GSON是谷歌在GitHub上开源的Java的JSON格式转换类库,能够实现Java对象向JSON的序列和反序列,这里我们就来举例讲解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);
    }
  }

}

相关文章

  • JavaWeb 简单分页实现代码

    JavaWeb 简单分页实现代码

    这篇文章主要介绍了JavaWeb 简单分页实现代码的相关资料,需要的朋友可以参考下
    2016-11-11
  • MyBatis #{}和${} |与数据库连接池使用详解

    MyBatis #{}和${} |与数据库连接池使用详解

    本文将为大家说说关于 #{} 和 ${},这个是 MyBatis 在面试中最常问的面试题,以及数据库连接池相关的知识,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • 使用Java实现压缩文件夹并打包下载

    使用Java实现压缩文件夹并打包下载

    这篇文章主要为大家详细介绍了如何使用Java实现压缩文件夹并打包下载,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • 解决Spring在Thread中注入Bean无效的问题

    解决Spring在Thread中注入Bean无效的问题

    这篇文章主要介绍了解决Spring在Thread中注入Bean无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 你所不知道的Spring自动注入详解

    你所不知道的Spring自动注入详解

    这篇文章主要给大家介绍了关于你所不知道的Spring自动注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java Proxy机制详细解读

    Java Proxy机制详细解读

    这篇文章主要介绍了Java Proxy机制详细解读,还是非常不错的,这里分享给大家,需要的朋友可以参考下。
    2017-10-10
  • maven项目不编译xml文件问题

    maven项目不编译xml文件问题

    这篇文章主要介绍了maven项目不编译xml文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Java打印斐波那契前N项的实现示例

    Java打印斐波那契前N项的实现示例

    这篇文章主要介绍了Java打印斐波那契前N项的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java代码审计的一些基础知识你知道吗

    Java代码审计的一些基础知识你知道吗

    这篇文章主要介绍了基于Java的代码审计功能的基础知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • JAVA中ListIterator和Iterator详解与辨析(推荐)

    JAVA中ListIterator和Iterator详解与辨析(推荐)

    这篇文章主要介绍了JAVA中ListIterator和Iterator详解与辨析,需要的朋友可以参考下
    2017-04-04

最新评论