java在调用第三方的接口时经常会获取到一堆json,一般都想转化成对应的实体来操作,具体的方式如下
1.JSON-Java库,org.json,这个库提供了用于解析和操作Java中的JSON的类。此外,这个库还可以在JSON、XML、HTTP头、Cookie、逗号分隔列表或文本等之间进行转换。
2.Jaskon:Jackson是一个用于Java平台的流行的JSON处理库。它提供了一种简单而灵活的方法来将Java对象转换为JSON格式,以及将JSON格式转换回Java对象。Jackson库由三个主要的模块组成:jackson-databind、jackson-core和jackson-annotations。
3.GSON:谷歌开发的 JSON 库,是一个用于Java编程语言的库,用于实现Java对象和JSON数据之间的序列化和反序列化。它可以将Java对象转换为JSON字符串,也可以将JSON字符串转换为Java对象。GSON库提供了简单的toJson()和fromJson()方法,使得序列化和反序列化变得非常容易。
4.FastJSON:阿里巴巴开发的 JSON 库,是一个轻量级的Java库,用于将JSON字符串有效地转换为Java对象,以及将Java对象转换为JSON字符串。它提供了简单易用的API,能够快速地实现JSON和Java对象之间的相互转换。FastJSON支持将Java对象序列化为JSON字符串,也支持将JSON字符串反序列化为Java对象。这使得在Java应用程序中处理JSON数据变得更加便捷和高效。
引入
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
接下来,可以使用 org.json 库中的类来解析和操作 JSON 数据。这个库提供了一些核心的类,包括 JSONObject、JSONArray 和 JSONTokener。
例子
import org.json.JSONObject;
public class JsonExample {
public static void main(String[] args) {
// 创建一个 JSON 对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "John");
jsonObject.put("age", 30);
jsonObject.put("isStudent", true);
// 将 JSON 对象转换为字符串
String jsonString = jsonObject.toString();
System.out.println(jsonString);
// 解析 JSON 字符串
String jsonStr = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":false}";
JSONObject parsedObject = new JSONObject(jsonStr);
String name = parsedObject.getString("name");
int age = parsedObject.getInt("age");
boolean isStudent = parsedObject.getBoolean("isStudent");
System.out.println("Name: " + name + ", Age: " + age + ", Is Student: " + isStudent);
}
}
引入
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>
接下来,我们将创建 Java 类来表示 JSON 数据的结构。假设我们有以下 JSON 数据:
{
"id": 123,
"name": "Pankaj",
"permanent": true,
"address": {
"street": "Albany Dr",
"city": "San Jose",
"zipcode": 95129
},
"phoneNumbers": [
123456,
987654
],
"role": "Manager",
"cities": [
"Los Angeles",
"New York"
],
"properties": {
"age": "29 years",
"salary": "1000 USD"
}
}
我们需要创建对应的 Java 类来表示这个 JSON 数据的结构。这里我们需要创建 Employee 和 Address 两个类。Employee 类如下
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Employee {
private int id;
private String name;
private boolean permanent;
private Address address;
private long[] phoneNumbers;
private String role;
private List<String> cities;
private Map<String, String> properties;
// 省略了 getter 和 setter 方法
}
Address 类如下:
public class Address {
private String street;
private String city;
private int zipcode;
// 省略了 getter 和 setter 方法
}
接下来,我们将使用 Jackson 将 JSON 数据转换为 Java 对象。这里我们将使用 ObjectMapper 类。以下是一个示例代码:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String json = "{\"id\":123,\"name\":\"Pankaj\",\"permanent\":true,\"address\":{\"street\":\"Albany Dr\",\"city\":\"San Jose\",\"zipcode\":95129},\"phoneNumbers\":[123456,987654],\"role\":\"Manager\",\"cities\":[\"Los Angeles\",\"New York\"],\"properties\":{\"age\":\"29 years\",\"salary\":\"1000 USD\"}}";
try {
ObjectMapper objectMapper = new ObjectMapper();
Employee employee = objectMapper.readValue(json, Employee.class);
System.out.println(employee.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用 ObjectMapper 的 readValue 方法将 JSON 数据转换为 Employee 对象。最后,我们打印了员工的名字。
// Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
// Gradle
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
接下来,需要创建一个Gson实例。有两种方法可以创建Gson实例。第一种方法是使用默认构造函数,第二种方法是使用GsonBuilder。以下是两种方法的示例:
// 使用默认构造函数创建Gson实例
Gson gson = new Gson();
// 使用GsonBuilder创建Gson实例
Gson gson = new GsonBuilder().setPrettyPrinting().create();
接下来,可以使用GSON将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。以下是示例代码:
// Java对象转换为JSON字符串
Staff staff = new Staff();
String json = gson.toJson(staff);
// JSON字符串转换为Java对象
String jsonString = "{\"name\":\"mkyong\",\"age\":35}";
Staff staff = gson.fromJson(jsonString, Staff.class);
如果需要将JSON字符串转换为JsonElement,然后再转换为字符串,可以使用以下代码:
JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);
String result = gson.toJson(jsonElement);
如果想要生成格式化的JSON输出,可以使用GsonBuilder的setPrettyPrinting()方法。这将生成更易读的JSON格式。
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String prettyJson = gson.toJson(staff);
如果需要排除某些字段,可以使用transient关键字或@Expose注解。transient关键字用于排除字段,而@Expose注解允许您控制字段的序列化和反序列化行为。
最后,如果需要自定义序列化和反序列化过程,您可以编写自定义的序列化器和反序列化器,并将它们注册到GsonBuilder中。
引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.31</version>
</dependency>
使用 Gradle 添加 FastJSON 依赖的示例:
compile 'com.alibaba:fastjson:2.0.31'
可以开始使用 FastJSON 进行对象和 JSON 之间的转换了。
要将 Java 对象转换为 JSON 字符串
User user = new User();
user.setName("John");
user.setAge(30);
String jsonString = JSON.toJSONString(user);
要将 JSON 字符串转换为 Java 对象,可以使用 parseObject() 方法
String jsonString = "{\"name\":\"John\",\"age\":30}";
User user = JSON.parseObject(jsonString, User.class);
FastJSON 还支持将 JSON 转换为 Map 或 List
String jsonString = "{\"name\":\"John\",\"age\":30}";
Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {});
🐋注意
FastJSON 默认情况下禁用了 AutoType 机制,以确保解析任意 JSON 数据的安全性。AutoType 机制允许用户控制的 JSON 数据实例化任何 Class,并为其构造函数提供任意参数。这可能导致反序列化安全问题。因此,FastJSON 的开发人员选择默认禁用 AutoType 机制,以确保解析任意 JSON 数据的安全性。
首先,让我们来看一下FastJSON和GSON的共同点。它们都能够将Java对象转换为JSON格式的数据,也可以将JSON数据转换为Java对象。这使得它们在处理网络请求和响应时非常有用。
接下来,我们来看一下FastJSON的特点。FastJSON是阿里巴巴开发的一个JSON处理库,它在性能上非常出色。相比于GSON,FastJSON通常能够更快地完成JSON数据的序列化和反序列化。此外,FastJSON还提供了一些高级特性,比如支持自定义序列化和反序列化规则,以及对日期格式的灵活处理。
而GSON是由Google开发的另一个流行的JSON处理库。虽然在性能上可能不如FastJSON,但GSON在易用性和稳定性方面表现出色。它具有清晰的文档和丰富的社区支持,因此对于一些开发者来说,GSON可能更容易上手。
总的来说,FastJSON在性能上有优势,而GSON在易用性和稳定性方面更胜一筹。因此,选择使用哪个库取决于你的具体需求。如果对性能要求较高,可以考虑使用FastJSON;如果更注重易用性和稳定性,那么GSON可能更适合你。