服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 实例详解SpringBoot默认的JSON解析方案

实例详解SpringBoot默认的JSON解析方案

2021-11-21 14:30我要大芒果 Java教程

JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,下面这篇文章主要给大家介绍了关于SpringBoot默认的JSON解析方案的相关资料,需要的朋友可以参考下

一、什么是json

json(javascript object notation)是一种基于javascript语法子集的开放标准数据交换格式。json是基于文本的,轻量级的,通常被认为易于读/写。

好了,废话不多说,下面开始介绍如何在springboot中使用json。

二、如何在springboot中使用json

在学习json之前,我们必须先了解一下httpmessageconverter,其实看名字就知道,这是一个消息转换工具。

下面我来介绍一下它的两个功能:

1、将服务端返回的对象序列化成 json 字符串。

2、将前端传来的 json 字符串反序列化成 java 对象。

所有的 json 生成都离不开相关的 httpmessageconverter。

springmvc 自动配置了 jackson 和 gson 的 httpmessageconverter,spring boot 中又对此做了自动化配置,下面是两者对应源码的路径:

?
1
org.springframework.boot.autoconfigure.http.jacksonhttpmessageconvertersconfiguration
?
1
org.springframework.boot.autoconfigure.http.gsonhttpmessageconvertersconfiguration

所以,如果用户使用 jackson 和 gson 的话,没有其他额外配置,则只需要添加依赖即可。

三、举例

第一步】老规矩,先创建一个springboot项目。通过右边的maven可以看到,其实springboot已经将json集成进来了,maven结构如下图:

实例详解SpringBoot默认的JSON解析方案

第二步】创建一个bean和一个controller类,具体项目结构和代码如下:

【项目结构】

实例详解SpringBoot默认的JSON解析方案

【user.java】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.mango.json.bean;
 
import com.fasterxml.jackson.annotation.jsonformat;
 
import java.util.date;
 
public class user {
 
    private integer id;
    private string username;
    private string address;
    
    public integer getid() {
        return id;
    }
 
    public void setid(integer id) {
        this.id = id;
    }
 
    public string getusername() {
        return username;
    }
 
    public void setusername(string username) {
        this.username = username;
    }
 
    public string getaddress() {
        return address;
    }
 
    public void setaddress(string address) {
        this.address = address;
    }
}

【usercontroller.java】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.mango.json.controller;
 
import com.mango.json.bean.user;
import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.responsebody;
import org.springframework.web.bind.annotation.restcontroller;
 
import java.util.arraylist;
import java.util.date;
import java.util.list;
 
@restcontroller
public class usercontroller {
 
    @getmapping("/user")
    public list<user> getuser() {
        list<user> userlist = new arraylist<>();
        for (int i = 0; i < 10; i++) {
            user user = new user();
            user.setid(i);
            user.setusername("mango>>>" + i);
            user.setaddress("www.mango.com>>>" + i);
            user.setbirthday(new date());
            userlist.add(user);
        }
        return userlist;
    }
}

【运行结果】

实例详解SpringBoot默认的JSON解析方案

注:大家可能和我显示的效果不一样,但是内容肯定是一样的,如果需要显示成我这样格式,需要给浏览器装一款插件jsonview,这款插件就专门为json格式设计的,因为很复杂的json格式,是不容易阅读的。

四、拓展

上面就是springboot中json的简单用法,下面我会再针对json进行一点内容的拓展。

1、如果碰到bean中有日期类型的属性,json该怎么处理日期格式?

第一种办法】我们可以在该属性上添加@jsonformat(pattern = “yyyy-mm-dd”)注解,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.mango.json.bean;
 
import com.fasterxml.jackson.annotation.jsonformat;
 
import java.util.date;
 
public class user {
 
    private integer id;
    private string username;
    private string address;
    
    @jsonformat(pattern = "yyyy-mm-dd")
    private date birthday;
 
    public date getbirthday() {
        return birthday;
    }
 
    public void setbirthday(date birthday) {
        this.birthday = birthday;
    }
 
    public integer getid() {
        return id;
    }
 
    public void setid(integer id) {
        this.id = id;
    }
 
    public string getusername() {
        return username;
    }
 
    public void setusername(string username) {
        this.username = username;
    }
 
    public string getaddress() {
        return address;
    }
 
    public void setaddress(string address) {
        this.address = address;
    }
}

如果该bean中存在许多日期类型的属性呢,这么做就不是那么合适了,所以,可以采用下面的第二种办法。

第二种办法】大家都知道json肯定离不开objectmapper,因为json格式和java中的对象之间进行转换就是通过objectmapper类,想深入研究的朋友可以看看这个类的源码。

在上面我提到了springboot自动化配置json,也给出了json源码的路径,大家可以进去看看,是否看到下面一段代码,这就是它的核心之处。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@configuration(proxybeanmethods = false)
@conditionalonclass(objectmapper.class)
@conditionalonbean(objectmapper.class)
@conditionalonproperty(name = httpmessageconvertersautoconfiguration.preferred_mapper_property,
        havingvalue = "jackson", matchifmissing = true)
static class mappingjackson2httpmessageconverterconfiguration {
 
    @bean
    @conditionalonmissingbean(value = mappingjackson2httpmessageconverter.class,
            ignoredtype = {
                    "org.springframework.hateoas.server.mvc.typeconstrainedmappingjackson2httpmessageconverter",
                    "org.springframework.data.rest.webmvc.alps.alpsjsonhttpmessageconverter" })
    mappingjackson2httpmessageconverter mappingjackson2httpmessageconverter(objectmapper objectmapper) {
        return new mappingjackson2httpmessageconverter(objectmapper);
    }
 
}

其中,mappingjackson2httpmessageconverter方法就是我们需要用到的,这是springboot为我们默认提供的,如果我们不重写这个方法,默认它就会生效,反之则失效。换句话说,我们不管是否重写该方法,json我们都可以用。

既然我们现在有需求了,我们就重写这个方法,具体代码如下:

【webmvcconfig.java】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.mango.json.config;
 
import com.fasterxml.jackson.databind.objectmapper;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.http.converter.json.mappingjackson2httpmessageconverter;
 
import java.text.simpledateformat;
 
@configuration
public class webmvcconfig {
 
    @bean
    mappingjackson2httpmessageconverter mappingjackson2httpmessageconverter(){
        mappingjackson2httpmessageconverter converter = new mappingjackson2httpmessageconverter();
        objectmapper objectmapper = new objectmapper();
        objectmapper.setdateformat(new simpledateformat("yyyy-mm-dd"));
        converter.setobjectmapper(objectmapper);
        return converter;
    }
}

注:重写这个方法后,我们可以将bean中的注解@jsonformat(pattern = “yyyy-mm-dd”)注释掉,重启项目即可。(如果大家有兴趣,可以进行debug调试,看看默认的方法是否还有效)

其实,大家可以从上面的代码看到,我们真正对日期格式进行设置的是对objectmapper进行操作的,所以这段重写的代码是否可以精简呢?答案是:当然可以。

有心的朋友肯定留意到了,上面springboot默认提供的mappingjackson2httpmessageconverter(objectmapper objectmapper)方法中,是存在objectmapper的,至于这个objectmapper是从哪里来的,大家可以根据下面路径中的源码看看:

【jacksonautoconfiguration.java源码路径】

?
1
org.springframework.boot.autoconfigure.jackson.jacksonautoconfiguration

【具体源码如下】

?
1
2
3
4
5
6
7
8
9
10
11
12
@configuration(proxybeanmethods = false)
    @conditionalonclass(jackson2objectmapperbuilder.class)
    static class jacksonobjectmapperconfiguration {
 
        @bean
        @primary
        @conditionalonmissingbean
        objectmapper jacksonobjectmapper(jackson2objectmapperbuilder builder) {
            return builder.createxmlmapper(false).build();
        }
 
    }

对,其实mappingjackson2httpmessageconverter(objectmapper objectmapper)方法中objectmapper就是上面源码中jacksonobjectmapper方法返回的objectmapper,大家可以debug试一下,看看是否正确。

废话不多说了,下面我就重写objectmapper,具体代码如下:

【webmvcconfig.java】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.mango.json.config;
 
import com.fasterxml.jackson.databind.objectmapper;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.http.converter.json.mappingjackson2httpmessageconverter;
 
import java.text.simpledateformat;
 
@configuration
public class webmvcconfig {
 
    /*@bean
    mappingjackson2httpmessageconverter mappingjackson2httpmessageconverter(){
        mappingjackson2httpmessageconverter converter = new mappingjackson2httpmessageconverter();
        objectmapper objectmapper = new objectmapper();
        objectmapper.setdateformat(new simpledateformat("yyyy-mm-dd"));
        converter.setobjectmapper(objectmapper);
        return converter;
    }*/
 
    @bean
    objectmapper objectmapper(){
        objectmapper objectmapper = new objectmapper();
        objectmapper.setdateformat(new simpledateformat("yyyy-mm-dd"));
        return objectmapper;
    }
}

【运行结果】

实例详解SpringBoot默认的JSON解析方案

注:因为上面两种方法最后的结果都是一样的,所以运行结果图只放一张。

总结

到此这篇关于springboot默认的json解析方案的文章就介绍到这了,更多相关springboot默认json解析内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/java_miss_you/article/details/104326415

延伸 · 阅读

精彩推荐
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18