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

}
(0)

相关推荐

  • 将Java的List结构通过GSON库转换为JSON的方法示例

    发现了google的gson,因为之前对于protocolbuf有一些了解,带着一些好奇心,我开始使用了gson. GitHub主页:https://github.com/google/gson 经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段. 将List或者Map转换成json非常简单: public String getJso

  • GSON实现Java对象与JSON格式对象相互转换的完全教程

    Gson是一个Java库,用来实现Json和Java对象之间的相互转换.Gson是一个托管在https://github.com/google/gson的开源项目. Gson中主要的类是Gson,也可以使用类GsonBuilder在创建Gson对象的同时设置一些选项. Gson对象在处理Json时不会保存任何状态,所以使用者能够很轻松的对同一个Gson对象进行多次序列化.反序列化等操作. 示例:基本使用 //Serialization Gson gson = new Gson(); gson.t

  • JAVA使用Gson解析json数据实例解析

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成.同XML一样是一种"传输格式".JSON采用与编程语言无关的文本格式,便于数据传输.存储.交换. 封装类Attribute: public class Attribute { private int id; private String name; private int age; public int getId() { return id; } p

  • Java中利用gson解析Json实例教程

    前言 本文主要跟大家介绍了关于Java用gson解析Json的相关内容,分享出来供大家参考学习,需要的朋友们下面来一起看看吧. json数据 { "resultcode": "200", "reason": "successed!", "result": { "sk": { "temp": "24", "wind_direction&qu

  • 使用GSON库转换Java对象为JSON对象的进阶实例详解

    对List和map等结构的常用转换操作基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析: [{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"

  • 举例讲解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

  • 举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加载后,Inner1没有加载,所以这个 静态变量j 无法立即使用,报错 final int z = 0; /*static void say1() { }*/ void say2() { } } //Inner2 在A加载好后就可以使用了 static class Inner2 { int k = 0

  • 举例讲解Java的Jackson库中ObjectMapper类的使用

    ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写. 类声明 以下是org.codehaus.jackson.map.ObjectMapper类的声明: public class ObjectMapper extends ObjectCodec implements Versioned 嵌套类 S.N. 类 & 描述 1 static class

  • 举例讲解Java中Piped管道输入输出流的线程通信控制

    PipedOutputStream和PipedInputStream 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流. 它们的作用是让多线程可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用. 使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的Pip

  • 举例讲解Java中final关键字的用法

    1. final variable final variable 就是一个常量,一旦被初始化就不可以被改变. class Test1 { final double PI = 3.14; //常量的名称最好大写 public Test1(){ PI = 3.14; } void test(){ System.out.println("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(

  • 举例讲解Java编程中this关键字与super关键字的用法

    this 总要有个事物来代表类的当前对象,就像C++中的this指针一样,Java中的this关键字就是代表当前对象的引用. 它有三个主要的作用: 1.在构造方法中调用其他构造方法.       比如有一个Student类,有三个构造函数,某一个构造函数中调用另外构造函数,就要用到this(),而直接使用Student()是不可以的. 2.返回当前对象的引用. 3.区分成员变量名和参数名. 看下面的例子: public class Student { private String name; p

  • 举例讲解Java设计模式编程中模板方法模式的运用实例

    模板方法模式定义为: 在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤. 模板方法在基类中定义了一个操作的流程顺序,能够保证该步骤按序进行,有一些步骤的具体实现在基类中已经声明,而将一些变化的步骤的具体实现交给了子类去实现,从而就达到了延迟一些步骤到子类中,模板方法一个最大的好处就是能够设定一个业务流程能够按照一定严格的顺序执行,控制了整个算法的执行步骤. 这个方法将算法定义成一组步骤,其中凡是想让

  • 举例讲解Java中synchronized关键字的用法

    synchronized关键字顾名思义,是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 1. 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在this或者实例对象引用上面的.比如a,b同为Main类的实例化对象,a调用被同步的方法,和b调用被同步的方法,没有形成互斥.但是不同线程的a对象调用被同步的方法就被互斥了. public synchronized void method(){ //-. } public void method

  • 举例讲解Java中数组和字符串类型的使用方法

    Java数组 数组是具有相同数据类型的一组数据的集合,Java支持多为数组,一维数组的每个基本单元都是基本数据类型的数据,二维数组就是每个基本单元是一维数组的一维数组,以此类推,n维数组的每个基本单元都是n-1为数组的n-1维数组.下面以一维数组为例说明Java数组的用法. 1.数组声明 数组声明有如下两种形式(方括号的位置不同): int arr[]; int[] arr2; 2.数组初始化 数组初始化也有两种形式,如下(使用new或不使用new): int arr[] = new int[]

  • 举例讲解Java中的多线程编程

    Java创建线程(Runnable接口和Thread类) 大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的依次介绍了每一种方式. 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声

随机推荐