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开发中的重要性只会越来越高。




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