Gson入门到精通

Google Gson是一个开源的,基于Java的类库。它是由Google开发的,使用Gson有助于将Java对象序列化为JSON,反之亦然。
下面是Gson的特点:

  •     易于使用 - Gson API提供了一个高级外观来简化常用的用例。
  •     无需创建映射 - Gson API为大部分要序列化的对象提供了默认映射。
  •     性能优 - Gson速度相当快,内存占用量低。 它适用于大型对象图或系统。
  •     干净JSON - Gson创建一个干净而紧凑的JSON结果,它易于阅读。
  •     无依赖性—Gson库不需要JDK以外的任何其他库。
  •     开源 - Gson库是开源的; 它是免费提供的。

我们为什么使用Gson,不光是因为Gson有上面的特点,还有下面的原因:

  •     标准化 - Gson是一个由Google管理的标准化库。
  •     高效 - 这是对Java标准库的可靠,快速和高效的扩展。
  •     优化 - Gson库经过高度优化。
  •     支持泛型 - 它为泛型提供了广泛的支持。
  •     支持复杂的内部类 - 它支持具有深度继承层次结构的复杂对象。

下面是处理JSON的三种方法:

  • 流媒体API,它读取和写入JSON内容作为离散事件。JsonReader和JsonWriter将数据读取/写入令牌,称为JsonToken。流媒体API是处理JSON的三种方法中最强大的方法。它具有最低的开销,并且在读/写操作中速度非常快。它类似于用于XML的Stax解析器。
  • 树模型,它准备JSON文档的内存树表示。它构建了一个JsonObject节点树。这是一种灵活的方法,类似于XML的DOM解析器。
  • 数据绑定,它使用属性访问器将JSON转换为POJO(普通旧Java对象)并从中转换。Gson使用数据类型适配器读取/写入JSON。 它类似于XML的JAXB解析器。

1. Gson类

Gson是Google Gson库的主要操作类。它提供了将Java对象转换为匹配的JSON结构的功能,反之亦然。 Gson首先使用GsonBuilder构建,然后使用toJson(Object)或fromJson(String,Class)方法读取/写入JSON构造。

GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();

Gson gson = builder.create();

Article article = new Article(1, "My Article");

String articleStr = gson.toJson(article);
System.out.println(articleStr);

Article article2 = gson.fromJson(articleStr, Article.class);
System.out.println(article2);

2. Gson对象序列化

即将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。

public class GsonDemo {

	public static void main(String[] args) {
		try {
			GsonDemo demo = new GsonDemo();
			Article article = new Article(1, "My Article");
			demo.writeJSON(article);

			Article article2 = demo.readJSON();
			System.out.println(article2);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void writeJSON(Article article) throws IOException {
		FileWriter writer = new FileWriter("article.json");
		writer.write(new GsonBuilder().create().toJson(article));
		writer.close();
	}
	private Article readJSON() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
		return new GsonBuilder().create().fromJson(
				new BufferedReader(new FileReader("article.json")), Article.class);
	}
}

3. Gson数据绑定

数据绑定API用于使用属性访问器或使用注释将JSON转换为POJO或从POJO转换为JSON。Gson有两种类型数据绑定:
    原始数据绑定 - 将JSON转换为Java地图,列表,字符串,数字,布尔值和NULL对象。
    对象数据绑定 - 从任何JAVA类型转换JSON。

原始数据绑定是指将JSON映射到JAVA核心数据类型和内置集合。Gson提供了各种内置适配器,可用于序列化/反序列化原始数据类型。

public class GsonDemo2 {
	public static void main(String[] args) {
		Gson gson = new Gson(); 
		int id = 1; 
		String title = "Gson"; 
		String[] labels = {"Gson","Json"};  

		//序列化 
		System.out.println("{"); 
		System.out.println("id: " + gson.toJson(id) +","); 
		System.out.println("title: " + gson.toJson(title) +","); 
		System.out.println("labels: " + gson.toJson(labels) +","); 
		System.out.println("}");  

		//反序列化
		id = gson.fromJson("1", Integer.class); 
		title = gson.fromJson("\"Gson\"", String.class); 
		labels = gson.fromJson("[\"Gson\",\"Json\"]", String[].class); 

		System.out.println("id: " + id); 
		System.out.println("title: " + title); 
		System.out.println("labels:" + Arrays.toString(labels)); 
	}
}

对象数据绑定是指将JSON映射到任何JAVA对象。

public class GsonDemo2 {
	public static void main(String[] args) {
		Gson gson = new Gson(); 
		Article article = new Article(1, "My Article");

		String jsonStr = gson.toJson(article);          
		System.out.println(jsonStr); 

		Article article2 = gson.fromJson(jsonStr, Article.class); 
		System.out.println(article2);
	}
}

4. Gson树模型

树模型准备JSON文档的内存树表示。它构建了一个JsonObject节点树。这是一种灵活的方法,类似于XML的DOM解析器。

public class GsonDemo2 {
	public static void main(String[] args) {
		String jsonStr = "{\"id\":1, \"title\":\"Gson\", \"labels\": [\"Gson\",\"Json\"]}";
		/**
		 * 1. 从JSON创建树。
		 * 在读取JSON之后,JsonParser提供了一个指向树的根节点的指针。根节点可以用来遍历整个树。
		 */
		JsonParser parser = new JsonParser();
		JsonElement rootNode = parser.parse(jsonStr);

		/**
		 * 2. 遍历树模型。
		 * 在遍历树并处理数据时,使用到根节点的相对路径获取每个节点。
		 */
		if (rootNode.isJsonObject()) {
			JsonObject details = rootNode.getAsJsonObject();
			
			JsonElement idNode = details.get("id");
			System.out.println("Id: " + idNode.getAsInt());
			
			JsonElement titleNode = details.get("title");
			System.out.println("Title: " + titleNode.getAsString());

			JsonArray labels = details.getAsJsonArray("labels");

			for (int i = 0; i < labels.size(); i++) {
				JsonPrimitive value = labels.get(i).getAsJsonPrimitive();
				System.out.print(value.getAsString() + " ");
			}
		}
	}
}

5. Gson数据流

Streaming API用于通过令牌读取JSON令牌。它读取和写入JSON内容作为离散事件。JsonReader和JsonWriter将数据读取/写入令牌,称为JsonToken。

public class GsonDemo2 {
	public static void main(String[] args) {
		String jsonStr = "{\"id\":1, \"title\":\"Gson\", \"labels\": [\"Gson\",\"Json\"]}";
		try {
			handleJsonObject(new JsonReader(new StringReader(jsonStr)));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void handleJsonObject(JsonReader reader) throws IOException {
		reader.beginObject();
		String field = null;

		while (reader.hasNext()) {
			JsonToken token = reader.peek();

			if (token.equals(JsonToken.BEGIN_ARRAY)) {
				System.out.print("Labels: [ ");
				handleJsonArray(reader);
				System.out.print("]");
			} else if (token.equals(JsonToken.END_OBJECT)) {
				reader.endObject();
				return;
			} else {
				if (token.equals(JsonToken.NAME)) {
					field = reader.nextName();
				}
				if ("id".equals(field)) {
					token = reader.peek();
					System.out.println("Id:" + reader.nextInt());
				}
				if ("title".equals(field)) {
					token = reader.peek();
					System.out.println("Title: " + reader.nextString());
				}
			}
		}
	}

	private static void handleJsonArray(JsonReader reader) throws IOException {
		reader.beginArray();
		while (true) {
			JsonToken token = reader.peek();
			if (token.equals(JsonToken.END_ARRAY)) {
				reader.endArray();
				return;
			} else if (token.equals(JsonToken.BEGIN_OBJECT)) {
				handleJsonObject(reader);
			} else if (token.equals(JsonToken.END_OBJECT)) {
				reader.endObject();
			} else {
				System.out.print(reader.nextString() + ", ");
			}
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AngeliaZheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值