Java中打印JSON的实用方法与最佳实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端数据交互、配置文件存储等场景,调试时,我们经常需要将Java对象或JSON字符串打印到控制台,以便查看数据结构或排查问题,本文将详细介绍Java中打印JSON的多种方法,从基础到进阶,涵盖不同场景下的解决方案。
使用System.out.println直接打印(基础但有限制)
对于简单的JSON字符串,最直接的方式是使用System.out.println直接输出,但需要注意,如果JSON字符串中包含转义字符(如换行符、引号等),打印时可能会出现格式混乱或显示异常。
示例代码:
public class BasicJsonPrint {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":25,\"hobbies\":[\"阅读\",\"编程\"]}";
System.out.println(jsonString);
}
}
输出结果:
{"name":"张三","age":25,"hobbies":["阅读","编程"]}
局限性:
- 无法格式化输出(如缩进、换行),可读性较差;
- 若JSON字符串中包含特殊字符(如
\n、\t),打印时可能无法正确显示原义; - 不适用于复杂对象(如自定义Java对象需先手动转换为JSON字符串)。
使用第三方库实现格式化打印(推荐)
实际开发中,我们更推荐使用成熟的JSON处理库(如Gson、Jackson、Fastjson等),它们不仅支持Java对象与JSON的相互转换,还能提供格式化输出、日期处理、自定义序列化等高级功能,以下是三种主流库的使用方法。
使用Gson打印JSON
Google开发的Gson是Java生态中最流行的JSON库之一,简洁易用,支持格式化输出。
(1)添加依赖(Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
(2)示例代码:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Arrays;
import java.util.List;
public class GsonJsonPrint {
public static void main(String[] args) {
// 定义Java对象
Person person = new Person("张三", 25, Arrays.asList("阅读", "编程"));
// 创建Gson实例(设置格式化输出)
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 将对象转换为格式化的JSON字符串并打印
String formattedJson = gson.toJson(person);
System.out.println(formattedJson);
}
static class Person {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
}
}
(3)输出结果(格式化后):
{
"name": "张三",
"age": 25,
"hobbies": [
"阅读",
"编程"
]
}
关键点:
GsonBuilder().setPrettyPrinting():启用格式化输出,自动添加缩进和换行;gson.toJson(obj):支持任意Java对象(基本类型、集合、自定义对象等)。
使用Jackson打印JSON
Jackson是另一个高性能的JSON库,广泛用于Spring框架中,功能强大且灵活。
(1)添加依赖(Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
(2)示例代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.Arrays;
import java.util.List;
public class JacksonJsonPrint {
public static void main(String[] args) {
// 定义Java对象
Person person = new Person("李四", 30, Arrays.asList("旅行", "摄影"));
// 创建ObjectMapper实例(启用格式化)
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
try {
// 转换为JSON字符串并打印
String formattedJson = objectMapper.writeValueAsString(person);
System.out.println(formattedJson);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
static class Person {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
}
}
(3)输出结果:
{
"name" : "李四",
"age" : 30,
"hobbies" : [ "旅行", "摄影" ]
}
关键点:
objectMapper.enable(SerializationFeature.INDENT_OUTPUT):启用缩进格式化;objectMapper.writeValueAsString(obj):将对象序列化为JSON字符串;- 支持更复杂的配置(如日期格式、忽略空字段等)。
使用Fastjson打印JSON
Fastjson是阿里巴巴开源的JSON库,解析速度快,但需注意版本安全性(建议使用1.2.83+版本)。
(1)添加依赖(Maven):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
(2)示例代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.util.Arrays;
import java.util.List;
public class FastjsonJsonPrint {
public static void main(String[] args) {
// 定义Java对象
Person person = new Person("王五", 28, Arrays.asList("游戏", "音乐"));
// 使用JSON.toJSONString并设置格式化
String formattedJson = JSON.toJSONString(person, SerializerFeature.PrettyFormat);
System.out.println(formattedJson);
}
static class Person {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
}
}
(3)输出结果:
{
"name": "王五",
"age": 28,
"hobbies": [
"游戏",
"音乐"
]
}
关键点:
SerializerFeature.PrettyFormat:启用格式化输出;- Fastjson还支持
WriteMapNullValue(输出null字段)、WriteDateUseDateFormat(日期格式化)等特性。
在日志框架中打印JSON(生产环境推荐)
在Java Web应用中,通常使用日志框架(如SLF4J + Logback、Log4j2)记录日志,而非直接使用System.out.println,可通过日志框架的“结构化日志”功能打印JSON,同时支持日志级别控制(如DEBUG、INFO)。
示例(使用SLF4J + Logback):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class LoggingJsonPrint {
private static final Logger logger = LoggerFactory.getLogger(LoggingJsonPrint.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) {
Person person = new Person("赵六", 35, Arrays.asList("跑步", "烹饪"));
try {
// 转换为JSON字符串
String json = objectMapper.writeValueAsString(person);
// 使用INFO级别打印JSON
logger.info("用户信息:{}", json);
} catch (JsonProcessingException e) {
logger.error("JSON转换失败", e);
}
}
static class Person {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
}
}
输出(Logback配置<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n):
14:30:25 [main] INFO LoggingJsonPrint - 用户信息:{"name":"赵六","age":35,"hobbies":["跑步","烹饪"]}
关键点:
- 日志框架支持参数化日志(),自动替换占位符;
- 可通过日志



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