目录
概述
JSON的形式
JSON作为一个字符串:
JSON作为一组键值对:
JSON解析为Java对象:
常用方法
几种常用JSON库
Gson(还可以)
FastJson(推荐)
Jackson(推荐)
Json-lib(了解既可)
四个库的maven依赖
JSON序列化
JSON反序列化
序列化方法处理流程
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,采用的是键值对的方式,包含对象(或者叫记录、结构、字典、哈希表、有键列表或关联数组等)和数组两种结构。
它的语法规则也比较简单:
JSON的这种简单易懂的格式使得它成为了不同语言之间进行数据交换的常用格式,因为大部分现代编程语言都支持键值对的无序集合(对象)和值的有序列表(数组)这两种常见的数据结构。
除了语法规则简单,JSON还有其他的优点,比如易于人类阅读和编写,也易于机器解析和生成。这使得JSON成为了一种理想的数据交换语言,被广泛应用于Web服务和API。
在Java中,JSON通常表示为字符串或者一组键值对。如果JSON是一个字符串,那么它需要被解析成Java对象才能使用。如果JSON是一组键值对,那么它可以直接在Java中使用。
String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
这个字符串包含了JSON数据。要使用这个数据,我们需要将其解析为一个Java对象。
Map jsonObject = new HashMap<>();
jsonObject.put("name", "John");
jsonObject.put("age", 30);
jsonObject.put("city", "New York");
这个Map对象包含了同样的JSON数据,但它是在Java中直接使用的。
如果JSON字符串包含了复杂的数据结构,比如数组或者嵌套的对象,那么解析JSON字符串为Java对象会更有用。我们可以使用诸如Jackson或Gson这样的库来将JSON字符串解析为Java对象。
例如,如果我们有一个JSON字符串表示一个用户,如下所示:
String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\", \"friends\":[\"Jane\", \"Tom\"]}";
我们可以创建一个对应的Java类来表示这个用户:
public class User {
private String name;
private int age;
private String city;
private List friends;
// getters and setters
}
然后我们可以使用Jackson或Gson库将JSON字符串解析为User对象:
User user = objectMapper.readValue(jsonString, User.class); // 使用Jackson库
User user = gson.fromJson(jsonString, User.class); // 使用Gson库
这样,我们就可以在Java中使用这个User对象了。
具体参见:JSON官网
在Java中处理JSON数据时,我们经常用到以下常用方法:
Java中处理JSON的常用方法有以下几种:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也方便机器解析和生成。它基于ECMAScript的一个子集,用于存储和交换文本信息。
在Java中处理JSON,我们通常使用库来简化工作。常用的库包括:Gson,FastJson,Jackson,Json-lib。
项目地址:GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back
Gson是Google开发的一个开源JSON库,它是一个非常强大的JSON解析库,功能齐全,使用简单,适用于处理大型和复杂的JSON数据。除了toJson和fromJson两个转换函数之外,Gson还提供了许多其他功能,例如自定义序列化和反序列化规则、注解支持等。Gson的优点之一是它具有良好的性能,尽管在某些情况下可能不如其他一些JSON库。此外,Gson的API简单易用,易于上手和使用。它还具有良好的可扩展性,可以通过自定义规则来扩展其功能。
在使用Gson之前,需要先创建对象的类型以及其成员。只要类中有get和set方法,Gson就可以实现复杂类型的json到bean或bean到json的转换。这使得Gson成为JSON解析的神器,被许多公司和用户广泛应用。
总之,Gson是一个功能齐全、使用简单、性能良好且可扩展的Java JSON库,适用于处理大型和复杂的JSON数据。
项目地址:GitHub - alibaba/fastjson: FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
Fastjson是一个非常高效的JSON处理库,由阿里巴巴开发并维护。它的设计目标是提供超高的性能以及简单易用的API。Fastjson是用Java编写的,因此它可以无缝地集成到Java项目中。它不需要任何外部的依赖,可以直接运行在任何支持Java的平台上。
Fastjson对于复杂类型的Java Bean转换为JSON的时候有一些问题。这是因为Java的对象模型和JSON的数据模型在表达数据方面有一些不同。在处理复杂类型的Java Bean时,可能会出现一些引用的问题。例如,如果两个Java对象互相引用,那么在转换为JSON时可能会出现问题,因为JSON不支持循环引用。
Fastjson提供了一种解决方案来处理这种问题,那就是使用@Reference
注解。通过这个注解,你可以明确指定哪些对象是相互引用的,这样Fastjson就能够正确地处理这些引用。
Fastjson的性能确实非常出色。它使用了独创的算法来优化解析和生成JSON的速度,这使得它在速度上超过了其他所有的JSON库。这使得Fastjson在需要处理大量JSON数据的场景中特别有用。
总的来说,Fastjson是一个非常强大且高效的JSON处理库,适用于需要处理大量JSON数据的Java项目。虽然它对于复杂类型的Java Bean转换可能会有些问题,但是通过使用@Reference
注解或者其他解决方案,这些问题可以得到解决。
项目地址:https://github.com/FasterXML/jackson
Jackson是一个广泛使用的Java开源框架,用于序列化和反序列化JSON。它的社区非常活跃,更新速度也很快。 从Github中的统计来看,Jackson能够成为最流行的JSON解析器之一,Spring MVC的默认json解析器便是Jackson,这归功于它的诸多优点和灵活的API。
以下是Jackson的优点:
Jackson核心模块包括:
这些模块使得Jackson具有强大的功能和灵活性,能够满足各种不同的JSON处理需求。
项目地址:Maven - Json-lib::Welcome
Json-lib最开始的也是应用最广泛的json解析工具。然而,它有一些缺点:
net.sf.json-lib
json-lib
最新的版本号
jdk15
com.google.code.gson
gson
最新的版本号
com.alibaba
fastjson
最新的版本号
com.fasterxml.jackson.core
jackson-databind
最新的版本号
com.fasterxml.jackson.core
jackson-annotations
最新的版本号
注意:将上述代码中的"最新的版本号"替换为所要使用的最新版本号。
Java的JSON序列化是将Java对象转换成JSON格式的过程。在Java中,有许多库可以用来进行JSON序列化,例如Jackson、Gson和Fastjson等。
以下是一个使用Jackson库进行JSON序列化的示例:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Example {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person("John", 30);
String json = objectMapper.writeValueAsString(person);
System.out.println(json);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在这个示例中,我们使用ObjectMapper将Person对象转换成JSON字符串。在调用writeValueAsString()方法时,ObjectMapper会自动遍历Person对象的所有字段,并将它们转换成JSON格式。
以下是使用FastJson库进行JSON序列化的示例:
import com.alibaba.fastjson.JSON;
public class Example {
public static void main(String[] args) {
Person person = new Person("John", 30);
String json = JSON.toJSONString(person);
System.out.println(json);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在这个示例中,我们使用FastJson的JSON类将Person对象转换成JSON字符串。调用toJSONString()方法时,FastJson会自动遍历Person对象的所有字段,并将它们转换成JSON格式。 输出的JSON字符串类似于:
{"name":"John","age":30}
JSON反序列化是将JSON格式的数据转换成Java对象的过程。在Java中,有许多库可以用来进行JSON反序列化,例如Jackson、Gson和Fastjson等。
以下是一个使用Jackson库进行JSON反序列化的示例:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Example {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"John\",\"age\":30}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
在这个示例中,我们使用ObjectMapper将JSON字符串转换成Person对象。在调用readValue()方法时,ObjectMapper会自动将JSON字符串解析成Java对象。
以下是使用FastJson库进行JSON反序列化的示例:
import com.alibaba.fastjson.JSON;
public class Example {
public static void main(String[] args) {
String json = "{\"name\":\"John\",\"age\":30}";
Person person = JSON.parseObject(json, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
在这个示例中,我们使用FastJson的JSON类将JSON字符串转换成Person对象。调用parseObject()方法时,FastJson会自动将JSON字符串解析成Java对象。输出的结果类似于:
John
30
序列化:把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。
反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。
基本流程为:
在反序列化的过程中,首先需要将字节序列解析为对象的状态信息,然后通过反序列化工具类将其恢复为对象。
这个过程就是序列化和反序列化的基本流程。