现在大部分应用前后端都是分离,通常使用json作为数据传输。这里有必要详细说一下spring和json整合。这里采用阿里的fastjson。
这里以springmvc进行介绍,因为springboot功能太过于强,很多东西不需要配置,这样对于理解原理是不太友好的。
定义一个pojo类:
public class User {
private String username;
private String password;
private Integer age;
public User() {
}
public User(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
一、json字符串与pojo互转
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html; charset=UTF-8</value>
<value>application/json; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@RequestMapping(value = "/user/json", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public User userFromJson(@RequestBody User user) {
System.out.println(user);
return user;
}
首先需要在springmvc配置文件中添加fastjson配置,然后再用@RequestBody接收参数,再底层就会实现互转。
二、json和pojo成员名字不一致
当json中字段与pojo成员名字不一致时,自动转化就会失败,我们可以通过@JSONField注解进行标注,具体如下:
public class User {
@JSONField(name = "uname") //表示json串中字段名字是uname
private String username;
@JSONField(name = "pwd")
private String password;
private Integer age;
...
}
三、json中乱码
乱码分为请求中乱码和响应中的乱码
3.1、请求中的乱码
通过设置Request中setCharacterEncoding方法就能解决,之前写了一个博客介绍多种方式解决乱码问题,可参考:
3.2、响应中的乱码
响应中的乱码可以通过@RequestMapping中的produces属性声明application/json; charset=UTF-8即可,例如:
@RequestMapping(value = "/user/json", produces = "application/json; charset=UTF-8")
四、json中日期格式
通过注解@JSONField中format属性设置,用于转换时间戳
@JSONField(name = "date", format = "yyyy-MM-dd hh:mm:ss")
private Date dateTime;
五、json在springboot中应用
在springboot开发中通常都是通过编码方式进行设置,下面这段代码摘自fastjson wiki中
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//自定义配置...
//FastJsonConfig config = new FastJsonConfig();
//config.set ...
//converter.setFastJsonConfig(config);
converters.add(0, converter);
}
}
六、总结
json在web开发中是常用技术,将常用的内容总结一下,供后面使用