Gson入门篇——常用用法

JSON的序列化和反序列化方法是成对存在的。最简单的莫过于使用默认,请参考

Gson入门篇——初级篇

下面步入正题,探讨除默认值(POJO成员变量名和JSON中key一致)外,Gson常用的Serialization&&Deserialization方法.

1.最灵活——自定义JsonSerializer&&JsonDeserializer

  • 定义要解析的POJO——Book
public class Book {

    private String[] authorsName;
    private String isbn10;
    private String title;
    //getter && setter
//为了便于查看结果,这个重载一下toString()
@Override
public String toString() {
      String infoMsg=  "Book POJO msg as follow:\n";
        System.out.println(infoMsg);
        return "title:  "+title+"\t\t\tisbn10: "+isbn10+"\t\t\tauthorsName: "+ Arrays.toString(authorsName);
    }
  • 定义BookSerializer完成序列化
package com.example;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import java.lang.reflect.Type;

public class BookSerializer implements JsonSerializer<Book> {

    @Override
    public JsonElement serialize(final Book book, final Type typeOfSrc, final JsonSerializationContext context) {
        final JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("title", book.getTitle());
        jsonObject.addProperty("isbn-10", book.getIsbn10());

        JsonArray nameArrElement = new JsonArray();
        String[] nameArr = book.getAuthorsName();
        if (nameArr != null && nameArr.length > 0) {
            for (int i = 0; i < nameArr.length; i++) {
                nameArrElement.add(nameArr[i]);
            }
        }
        jsonObject.add("author_name", nameArrElement);

        return jsonObject;
    }
}

注意:JsonObject中的几个关系
JsonObject.addProperty,就是将基本类型的数据添加到JsonOjbect这个“Map”中;
JsonObject.add(String property, JsonElement value).就是将一个复杂的对象作为value放入这个“Map”中;
JsonElement和JsonXX的关系如图所示
这里写图片描述

  • 调用&&进行测试
package com.example;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;

public class Main {

    public static void main(final String[] args) throws IOException {
        // Configure Gson
        final GsonBuilder gsonBuilder = new GsonBuilder();
        //注册使用BookSerializer序列化Book
        gsonBuilder.registerTypeAdapter(Book.class, new BookSerializer());
        //在生产环境中最好屏蔽,由于JSON格式化,可能产生大的JSON对象
        gsonBuilder.setPrettyPrinting();
        final Gson gson = gsonBuilder.create();

        final Book javaPuzzlers = new Book();
        javaPuzzlers.setTitle("Java Puzzlers: Traps, Pitfalls, and Corner Cases");
        javaPuzzlers.setIsbn10("032133678X");
        javaPuzzlers.setAuthorsName(new String[] { "Joshua Bloch", "Neal Gafter" });

        // Format to JSON
        final String json = gson.toJson(javaPuzzlers);
        System.out.println(json);
      }
}

结果如下:

{
  "title": "Java Puzzlers: Traps, Pitfalls, and Corner Cases",
  "isbn-10": "032133678X",
  "author_name": [
    "Joshua Bloch",
    "Neal Gafter"
  ]
}
  • 定义BookDeserializer完成反序列化
package com.example;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

import java.lang.reflect.Type;

public class BookDeserializer implements JsonDeserializer<Book> {

    @Override
    public Book deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        JsonObject jsonObject = jsonElement.getAsJsonObject();

        JsonElement titleElement = jsonObject.get("title");
        String title = "";
        //注意:如果要反序列化的JSON中没有title这个key,不进行null判断,会崩溃
        if (titleElement != null) {
            title = titleElement.getAsString();
        }

        JsonElement isbnElement = jsonObject.get("isbn-10");
        String isbn = "";
        if (titleElement != null) {
            isbn = isbnElement.getAsString();
        }

        JsonElement namesElement = jsonObject.get("author_name");
        JsonArray nameArray = namesElement.getAsJsonArray();
        String[] authorsArr = null;
        if (nameArray != null && nameArray.size() > 0) {
            authorsArr = new String[nameArray.size()];
            for (int i = 0; i < nameArray.size(); i++) {
                //为了书面整洁,这里没有进行null判断
                String nameString = nameArray.get(i).getAsString();
                authorsArr[i] = nameString;
            }
        }
        Book book = new Book();
        book.setTitle(title);
        book.setIsbn10(isbn);
        book.setAuthorsName(authorsArr);

        return book;
    }
}
  • 调用&&进行测试
package com.example;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;

public class Main {

    public static void main(final String[] args) throws IOException {
       String json="{\n" +
               "  \"title\": \"Java Puzzlers: Traps, Pitfalls, and Corner Cases\",\n" +
               "  \"isbn-10\": \"032133678X\",\n" +
               "  \"author_name\": [\n" +
               "    \"Joshua Bloch\",\n" +
               "    \"Neal Gafter\"\n" +
               "  ]\n" +
               "}";
        //进行反向解析
        final GsonBuilder gsonBuilder=new GsonBuilder();
        //注册反向解析器
        gsonBuilder.registerTypeAdapter(Book.class,new BookDeserializer());
        final Gson gson=gsonBuilder.create();
        Book resultBook= gson.fromJson(json,Book.class);
        System.out.println(resultBook);
    }
}

结果如下:

Book POJO msg as follow:

title:  Java Puzzlers: Traps, Pitfalls, and Corner Cases            isbn10: 032133678X          authorsName: [Joshua Bloch, Neal Gafter]

2.最简单——使用Annotation

我们可以这样理解,“默认值”可以看做是Annotation的一个特例,也就是Annotation中的key和POJO中的member variable一致.
对于isbn-10这种不符合java命名规范的只好使用Annotation进行显示标注;这里authorsName和JSON中的“author_name”不同,这里也进行添加注释.

  • 对Book中的字段添加SerializedName Annotation
package com.example;

import com.google.gson.annotations.SerializedName;

import java.util.Arrays;

public class Book {

    @SerializedName("author_name")
    private String[] authorsName;
    @SerializedName("isbn-10")
    private String isbn10;
    private String title;
    //getter && setter
    //toString
  • 进行序列化测试
package com.example;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;

public class Main {

    public static void main(final String[] args) throws IOException {
        // Configure GSON
        final GsonBuilder gsonBuilder = new GsonBuilder();
        //在生产环境中最好屏蔽,由于JSON格式化,可能产生大的JSON对象
        gsonBuilder.setPrettyPrinting();
        final Gson gson = gsonBuilder.create();

        final Book javaPuzzlers = new Book();
        javaPuzzlers.setTitle("Java Puzzlers: Traps, Pitfalls, and Corner Cases");
        javaPuzzlers.setIsbn10("032133678X");
        javaPuzzlers.setAuthorsName(new String[]{"Joshua Bloch", "Neal Gafter"});

        // Format to JSON
        final String json = gson.toJson(javaPuzzlers);
        System.out.println(json);

    }
}

结果如下:

{
  "author_name": [
    "Joshua Bloch",
    "Neal Gafter"
  ],
  "isbn-10": "032133678X",
  "title": "Java Puzzlers: Traps, Pitfalls, and Corner Cases"
}
  • 进行反序列化测试
package com.example;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;

public class Main {

    public static void main(final String[] args) throws IOException {
       String json="{\n" +
               "  \"title\": \"Java Puzzlers: Traps, Pitfalls, and Corner Cases\",\n" +
               "  \"isbn-10\": \"032133678X\",\n" +
               "  \"author_name\": [\n" +
               "    \"Joshua Bloch\",\n" +
               "    \"Neal Gafter\"\n" +
               "  ]\n" +
               "}";
        //进行反向解析
        final GsonBuilder gsonBuilder=new GsonBuilder();
        final Gson gson=gsonBuilder.create();
        Book resultBook= gson.fromJson(json,Book.class);
        System.out.println(resultBook);
    }
}

测试结果如下:

Book POJO msg as follow:

title:  Java Puzzlers: Traps, Pitfalls, and Corner Cases            isbn10: 032133678X          authorsName: [Joshua Bloch, Neal Gafter]

参考地址:
http://www.javacreed.com/gson-annotations-example/
http://www.javacreed.com/gson-serialiser-example/
http://www.javacreed.com/gson-deserialiser-example/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值