前言:
由于我们在开发、测试阶段,为了方便看日志,需要将原本的压缩json进行格式化显示,便于我们在日常开发过程中很直观的看到我们想要打印的信息,以及数据的层级关系。下面我们梳理了日常用的最多的两种 json 工具进行罗列
一、Jackson
进入maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
1、常规压缩打印
@Test
public void jackson01() throws JsonProcessingException {
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(pd));
}
结果:
{"id":123456,"name":"小明","address":"北京","today":1624448577901}
2、格式化打印
@Test
public void jackson02() throws JsonProcessingException {
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(pd));
}
结果:
{
"id" : 123456,
"name" : "小明",
"address" : "北京",
"today" : 1624448606828
}
3、对于本身为 String 类型,直接输出,不会予以格式化
@Test
public void jackson03() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String str = "{\"id\":123456,\"name\":\"小明\",\"address\":\"北京\",\"today\":1624448577901}";
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(str));
}
结果:
"{\"id\":123456,\"name\":\"小明\",\"address\":\"北京\",\"today\":1624448577901}"
4、使用 @JsonFormat 格式化时间
我们可以有两种用法(我知道的),在对象属性上,或者在属性的
getter
方法上
/**更新时间 用户可以点击更新,保存最新更新的时间。**/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date today;
@Test
public void jackson04() throws JsonProcessingException {
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(pd));
}
结果:
{"id":123456,"name":"小明","address":"北京","today":"2021-06-23 11:46:52"}
5、@JsonFormat 相差8小时问题
第四个例子,直接使用 @JsonFormat,在我们中国来讲和我们的北京时间,会相差8个小时,因为我们是东八区(北京时间)所以我们在格式化的时候要指定时区(
timezone
),也就是增加一个属性,timezone="GMT+8"
即可
/**更新时间 用户可以点击更新,保存最新更新的时间。**/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date today;
@Test
public void jackson05() throws JsonProcessingException {
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(pd));
}
结果:
{"id":123456,"name":"小明","address":"北京","today":"2021-06-23 19:51:18"}
二、Fastjson
maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
1、常规压缩打印
@Test
public void fastjson01(){
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
System.out.println(JSON.toJSONString(pd));
}
结果:
{"address":"北京","id":123456,"name":"小明","today":1624448483426}
2、格式化打印
@Test
public void fastjson02(){
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
System.out.println(JSON.toJSONString(pd, true)); //也可以用 toJSONString(object, SerializerFeature.PrettyFormat) 替换
}
结果:
{
"address":"北京",
"id":123456,
"name":"小明",
"today":1624448463986
}
3、内容和时间值,同时格式化
@Test
public void fastjson03(){
PersonData pd = new PersonData(123456L, "小明", "北京", new Date());
System.out.println(JSON.toJSONStringWithDateFormat(pd, JSON.DEFFAULT_DATE_FORMAT, SerializerFeature.PrettyFormat));
}
结果:
{
"address":"北京",
"id":123456,
"name":"小明",
"today":"2021-06-23 19:38:35"
}