您好,欢迎访问一九零五行业门户网

SpringBoot怎么返回Json数据格式

一、@restcontroller 注解在 spring boot 中的 controller 中使用 @restcontroller 注解即可返回 json 格式的数据。
@restcontroller 注解包含了 @controller 和 @responsebody 注解。
@responsebody 注解是将返回的数据结构转换为 json 格式。
@target({elementtype.type})@retention(retentionpolicy.runtime)@documented@controller@responsebodypublic @interface restcontroller { string value() default "";}
二、jackson在 spring boot 中默认使用的 json 解析技术框架是 jackson。
点开 pom.xml 中的 spring-boot-starter-web 依赖,可以看到 spring-boot-starter-json 依赖:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-json</artifactid> <version>2.0.3.release</version> <scope>compile</scope></dependency>
再次点进去上面提到的 spring-boot-starter-json 依赖,可以看到如下代码:
<dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.9.6</version> <scope>compile</scope></dependency><dependency> <groupid>com.fasterxml.jackson.datatype</groupid> <artifactid>jackson-datatype-jdk8</artifactid> <version>2.9.6</version> <scope>compile</scope></dependency><dependency> <groupid>com.fasterxml.jackson.datatype</groupid> <artifactid>jackson-datatype-jsr310</artifactid> <version>2.9.6</version> <scope>compile</scope></dependency><dependency> <groupid>com.fasterxml.jackson.module</groupid> <artifactid>jackson-module-parameter-names</artifactid> <version>2.9.6</version> <scope>compile</scope></dependency>
到此为止,可以知道 spring boot 中默认使用的 json 解析框架是 jackson。
1、对象、list、map 转换为json格式创建实体类:
public class user { private long id; private string username; private string password; /* 省略get、set和带参构造方法 */}
controller 层
import com.itcodai.course02.entity.user;import org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.restcontroller;import java.util.arraylist;import java.util.hashmap;import java.util.list;import java.util.map;@restcontroller@requestmapping("/json")public class jsoncontroller { @requestmapping("/user") public user getuser() { return new user(1, "倪升武", "123456"); //返回 {"id":1,"username":"倪升武","password":"123456"} } @requestmapping("/list") public list<user> getuserlist() { list<user> userlist = new arraylist<>(); user user1 = new user(1, "倪升武", "123456"); user user2 = new user(2, "达人课", "123456"); userlist.add(user1); userlist.add(user2); return userlist; //返回 [{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"达人课","password":"123456"}] } @requestmapping("/map") public map<string, object> getmap() { map<string, object> map = new hashmap<>(3); user user = new user(1, "倪升武", "123456"); map.put("作者信息", user); map.put("博客地址", "http://blog.itcodai.com"); map.put("csdn地址", "http://blog.csdn.net/eson_15"); map.put("粉丝数量", 4153); return map; //返回 {"作者信息":{"id":1,"username":"倪升武","password":"123456"},"csdn地址":"http://blog.csdn.net/eson_15","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"} }}
2、jackson 的配置类在转 json 格式的时候将所有的 null 转换为 “” 的配置
import com.fasterxml.jackson.core.jsongenerator;import com.fasterxml.jackson.databind.jsonserializer;import com.fasterxml.jackson.databind.objectmapper;import com.fasterxml.jackson.databind.serializerprovider;import org.springframework.boot.autoconfigure.condition.conditionalonmissingbean;import org.springframework.context.annotation.bean;import org.springframework.context.annotation.configuration;import org.springframework.context.annotation.primary;import org.springframework.http.converter.json.jackson2objectmapperbuilder;import java.io.ioexception;@configurationpublic class jacksonconfig { @bean @primary @conditionalonmissingbean(objectmapper.class) public objectmapper jacksonobjectmapper(jackson2objectmapperbuilder builder) { objectmapper objectmapper = builder.createxmlmapper(false).build(); objectmapper.getserializerprovider().setnullvalueserializer(new jsonserializer<object>() { @override public void serialize(object o, jsongenerator jsongenerator, serializerprovider serializerprovider) throws ioexception { jsongenerator.writestring(""); } }); return objectmapper; }}// 修改一下上面返回 map 的接口,将几个值改成 null 测试一下:@requestmapping("/map")public map<string, object> getmap() { map<string, object> map = new hashmap<>(3); user user = new user(1, "倪升武", null); map.put("作者信息", user); map.put("博客地址", "http://blog.itcodai.com"); map.put("csdn地址", null); map.put("粉丝数量", 4153); return map; // 返回 {"作者信息":{"id":1,"username":"倪升武","password":""},"csdn地址":"","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"} // 可以看到 jackson 已经将所有 null 字段转成空字符串了。}
三、fastjsonfastjson 是阿里巴巴开源的。
jackson 和 fastjson 有哪些区别?
从扩展上来看,fastjson 没有 jackson 灵活,从速度或者上手难度来看,fastjson 可以考虑,它也比较方便。
fastjson 的依赖
<dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.35</version></dependency>
fastjson 配置类使用 fastjson 时,对 null 的处理和 jackson 有些不同,需要继承 webmvcconfigurationsupport 类,然后覆盖 configuremessageconverters 方法。
在方法中,我们可以选择要实现 null 转换的场景,代码如下:
import com.alibaba.fastjson.serializer.serializerfeature;import com.alibaba.fastjson.support.config.fastjsonconfig;import com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter;import org.springframework.context.annotation.configuration;import org.springframework.http.mediatype;import org.springframework.http.converter.httpmessageconverter;import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport;import java.nio.charset.charset;import java.util.arraylist;import java.util.list;@configurationpublic class fastjsonconfig extends webmvcconfigurationsupport { @override public void configuremessageconverters(list<httpmessageconverter<?>> converters) { fastjsonhttpmessageconverter converter = new fastjsonhttpmessageconverter(); fastjsonconfig config = new fastjsonconfig(); config.setdateformat("yyyy-mm-dd"); config.setserializerfeatures( // 保留 map 空的字段 serializerfeature.writemapnullvalue, // 将 string 类型的 null 转成"" serializerfeature.writenullstringasempty, // 将 number 类型的 null 转成 0 serializerfeature.writenullnumberaszero, // 将 list 类型的 null 转成 [] serializerfeature.writenulllistasempty, // 将 boolean 类型的 null 转成 false serializerfeature.writenullbooleanasfalse, // 生成的json格式化 serializerfeature.prettyformat, // 避免循环引用 serializerfeature.disablecircularreferencedetect); converter.setfastjsonconfig(config); converter.setdefaultcharset(charset.forname("utf-8")); list<mediatype> mediatypelist = new arraylist<>(); // 解决中文乱码问题,相当于在 controller 上的 @requestmapping 中加了个属性 produces = "application/json" mediatypelist.add(mediatype.application_json); converter.setsupportedmediatypes(mediatypelist); converters.add(converter); }}
四、封装返回的数据格式除了要封装数据之外,我们往往需要在返回的 json 中添加一些其他信息,比如返回状态码 code,返回 msg 给调用者,调用者可以根据 code 或者 msg 进行一些逻辑判断。
统一的 json 结构中属性包括数据、状态码、提示信息即可。
public class jsonresult<t> { private t data; private string code; private string msg; /** * 若没有数据返回,默认状态码为 0,提示信息为“操作成功!” */ public jsonresult() { this.code = "0"; this.msg = "操作成功!"; } /** * 若没有数据返回,可以人为指定状态码和提示信息 * @param code * @param msg */ public jsonresult(string code, string msg) { this.code = code; this.msg = msg; } /** * 有数据返回时,状态码为 0,默认提示信息为“操作成功!” * @param data */ public jsonresult(t data) { this.data = data; this.code = "0"; this.msg = "操作成功!"; } /** * 有数据返回,状态码为 0,人为指定提示信息 * @param data * @param msg */ public jsonresult(t data, string msg) { this.data = data; this.code = "0"; this.msg = msg; } // 省略 get 和 set 方法}
修改 controller 中的返回值类型,测试
@restcontroller@requestmapping("/jsonresult")public class jsonresultcontroller { @requestmapping("/user") public jsonresult<user> getuser() { user user = new user(1, "倪升武", "123456"); return new jsonresult<>(user); // {"code":"0","data":{"id":1,"password":"123456","username":"倪升武"},"msg":"操作成功!"} } @requestmapping("/list") public jsonresult<list> getuserlist() { list<user> userlist = new arraylist<>(); user user1 = new user(1, "倪升武", "123456"); user user2 = new user(2, "达人课", "123456"); userlist.add(user1); userlist.add(user2); return new jsonresult<>(userlist, "获取用户列表成功"); // {"code":"0","data":[{"id":1,"password":"123456","username":"倪升武"},{"id":2,"password":"123456","username":"达人课"}],"msg":"获取用户列表成功"} } @requestmapping("/map") public jsonresult<map> getmap() { map<string, object> map = new hashmap<>(3); user user = new user(1, "倪升武", null); map.put("作者信息", user); map.put("博客地址", "http://blog.itcodai.com"); map.put("csdn地址", null); map.put("粉丝数量", 4153); return new jsonresult<>(map); // {"code":"0","data":{"作者信息":{"id":1,"password":"","username":"倪升武"},"csdn地址":null,"粉丝数量":4153,"博客地址":"http://blog.itcodai.com"},"msg":"操作成功!"} }}
以上就是springboot怎么返回json数据格式的详细内容。
其它类似信息

推荐信息