进入pom.xml,跟着箭头点进去
可以看到在pom中自动引入了jackson的包
测试类创建json
通过上面的pom我们知道springboot默认使用的是jackson
通过下面的代码看看是怎么把对象创建json的
package com.example.demoscala;
import com.example.demoscala.controller.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
class Solution {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user=new User();
user.setName("张三");
user.setPwd("123");
System.out.println("把对象转换成json");
ObjectWriter objectWriter = mapper.writerWithDefaultPrettyPrinter();
String s = objectWriter.writeValueAsString(user);
System.out.println(s);
System.out.println("把json解析成实体类");
User user1 = mapper.readValue(s, User.class);
System.out.println(user1);
}
}
创建控制层和实体类
在控制层使用@RestController注解
package com.example.demoscala.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/aa")
public User aa(){
User user=new User();
user.setName("张三");
user.setPwd("123");
return user;
}
}
package com.example.demoscala.controller;
public class User {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
进入@RestController的源码,可以看到在接口上面使用了@ResponseBody注解
在这里判断有没有使用@ResponseBody这个注解,如果有返回对应的处理器
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#selectHandler
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#supportsReturnType
然后拿着处理器的结果回到这里,如果不为空才进入下面箭头的方法
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
然后进入下面的方法,走到箭头这里
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, org.springframework.core.MethodParameter, org.springframework.http.server.ServletServerHttpRequest, org.springframework.http.server.ServletServerHttpResponse)
可以看到genericConverter是MappingJackson2HttpMessageConverter
因为MappingJackson2HttpMessageConverter 是GenericHttpMessageConverter的子类
然后进入write方法,然后点击箭头的方法进入
org.springframework.http.converter.AbstractGenericHttpMessageConverter#write
然后进入addDefaultHeaders 方法,可以看到,会把application/json放到headers中
org.springframework.http.converter.AbstractHttpMessageConverter#addDefaultHeaders
然后再进入下面的方法
org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal
就是在这里把user对象创建成json的
ServletServerHttpResponse 是HttpOutputMessage的子类
然后我们执行完毕代码之后,看到的界面效果就是json的格式了
不写@RestController,实现返回json
只需要在代码中创建MappingJackson2HttpMessageConverter
并调用write方法就可以实现
@Controller
public class TestController {
@GetMapping("/aa")
public void aa(HttpServletResponse response){
User user=new User();
user.setName("张三");
user.setPwd("123");
//映射json的http消息转换类
MappingJackson2HttpMessageConverter converter=new
MappingJackson2HttpMessageConverter();
try {
//返回实体类的对象,实体类的class,媒体类型json,把实体类写入到HttpOutputMessage中
converter.write(user, user.getClass(), MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
进入write方法,可以看到,就是我们上面讲过的源码内容
这也就是为什么加了@RestController,就能实现返回json的原理