Java中JSON的使用指南:从基础到实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端数据交互、配置文件、API响应等场景,本文将详细介绍在Java代码中如何使用JSON,包括常用库的选择、基本操作以及实际应用示例。
JSON处理库的选择
Java生态中有多种JSON处理库,以下是几种主流选择:
- Jackson:功能强大,性能优秀,Spring Framework默认使用
- Gson:Google开发,API简单易用
- org.json:轻量级,API直观
- Fastjson:阿里巴巴开发,性能优异(但曾存在安全漏洞)
本文以Jackson和Gson为例进行讲解,因为它们是最常用且稳定的解决方案。
使用Jackson处理JSON
添加依赖
Maven项目中添加Jackson依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
JSON字符串与对象互转
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
// JSON字符串转Java对象
String jsonStr = "{\"name\":\"张三\",\"age\":30,\"city\":\"北京\"}";
try {
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println(user.getName()); // 输出: 张三
// Java对象转JSON字符串
String json = objectMapper.writeValueAsString(user);
System.out.println(json); // 输出: {"name":"张三","age":30,"city":"北京"}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
class User {
private String name;
private int age;
private String city;
// getters和setters
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 String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
处理复杂JSON
对于嵌套JSON或集合类型:
// 处理List集合
List<User> userList = objectMapper.readValue(
"[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]",
new TypeReference<List<User>>() {}
);
// 处理嵌套对象
String complexJson = "{\"user\":{\"name\":\"张三\",\"age\":30},\"hobbies\":[\"reading\",\"swimming\"]}";
ComplexObject complex = objectMapper.readValue(complexJson, ComplexObject.class);
使用Gson处理JSON
添加依赖
Maven项目中添加Gson依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
JSON字符串与对象互转
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// JSON字符串转Java对象
String jsonStr = "{\"name\":\"张三\",\"age\":30,\"city\":\"北京\"}";
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getName()); // 输出: 张三
// Java对象转JSON字符串
String json = gson.toJson(user);
System.out.println(json); // 输出: {"name":"张三","age":30,"city":"北京"}
}
}
处理复杂JSON
// 处理List集合
List<User> userList = gson.fromJson(
"[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]",
new TypeToken<List<User>>() {}.getType()
);
// 处理嵌套对象
String complexJson = "{\"user\":{\"name\":\"张三\",\"age\":30},\"hobbies\":[\"reading\",\"swimming\"]}";
ComplexObject complex = gson.fromJson(complexJson, ComplexObject.class);
实际应用场景
HTTP请求响应处理
// 使用Jackson处理HTTP响应
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("https://api.example.com/users");
CloseableHttpResponse response = httpClient.execute(httpGet);
String jsonStr = EntityUtils.toString(response.getEntity());
User[] users = new ObjectMapper().readValue(jsonStr, User[].class);
配置文件读取
// 读取JSON配置文件
ObjectMapper mapper = new ObjectMapper();
try {
Config config = mapper.readValue(new File("config.json"), Config.class);
System.out.println("数据库URL: " + config.getDbUrl());
} catch (IOException e) {
e.printStackTrace();
}
日志记录为JSON格式
// 使用Jackson生成JSON日志
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> logEntry = new HashMap<>();
logEntry.put("timestamp", System.currentTimeMillis());
logEntry.put("level", "INFO");
logEntry.put("message", "用户登录成功");
logEntry.put("user", "张三");
String jsonLog = mapper.writeValueAsString(logEntry);
System.out.println(jsonLog);
最佳实践
-
异常处理:始终处理JsonProcessingException或JsonSyntaxException
-
性能考虑:重用ObjectMapper/Gson实例,避免重复创建
-
安全性:对反序列化的数据进行校验,防止注入攻击
-
日期处理:配置日期格式,避免时区问题
// Jackson配置日期格式 ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // Gson配置日期格式 Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") .create(); -
空值处理:配置如何处理null值
// Jackson配置 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // Gson配置 Gson gson = new GsonBuilder().serializeNulls().create();
在Java中处理JSON已经成为开发人员的必备技能,Jackson和Gson作为两大主流库,各有优势:Jackson功能全面,适合复杂场景;Gson API简洁,易于上手,根据项目需求选择合适的库,并遵循最佳实践,可以高效地完成JSON数据的序列化和反序列化工作,随着微服务架构的普及,JSON在Java开发中的重要性只会越来越高。



还没有评论,来说两句吧...