您的位置:首页 > 编程语言 > Java开发

Spring-Boot(一):使用自定义json解析器

2018-04-04 11:27 232 查看

Spring-Boot是基于Spring框架的,它并不是对Spring框架的功能增强,而是对Spring的一种快速构建的方式。

Spring-boot应用程序提供了默认的json转换器,为Jackson。示例:

pom.xml中dependency配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qinker</groupId>
<artifactId>spring-boot</artifactId>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>9</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

</dependencies>
<build>
<finalName>spring-boot</finalName>
</build>
</project>
创建三个类:MainApp.java和User.java以及HelloController.java:
package com.springboot;

import java.util.Date;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@RequestMapping("/hello")
public String hello() {
return "hello,SpringBoot";
}

/**
* Spring boot 默认json解析框架是Jackson
* @return
*/
@RequestMapping("/getUser")
public User getUser() {
User u = new User();
u.setName("张三");
u.setAge(33);
u.setCreateTime(new Date());
return u;
}
}
package com.springboot;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

private String name;

private int age;

private Date createTime;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Date getCreateTime() {
return createTime;
}

public void setCreateTime(Date createTime) {
this.createTime = createTime;
}

}
package com.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApp{

public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
}
启动MainApp:访问http://localhost:8080/getUser,结果如下:
{"name":"张三","age":33,"createTime":"2018-04-04T03:03:08.534+0000"}
可见:我们并未做任何配置,返回的却是json数据,可见Spring-Boot对json做了默认实现,使用的是内置Jackson转换器。

那么,下面看看如何使用自定义的json转换器,这里以fastjson为例:

首先,引入fastjson包,在pom中添加如下依赖:

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
为了方便看出效果:修改User类:
package com.springboot;

import java.io.Serializable;
import java.util.Date;

import com.alibaba.fastjson.annotation.JSONField;

@SuppressWarnings("serial")
public class User implements Serializable{

private String name;

private int age;

@JSONField(format="yyyy-MM-dd HH:mm")
private Date createTime;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Date getCreateTime() {
return createTime;
}

public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
1.实现fastjson自定义json转换的第一种方式,Spring-Boot实现WebMvcConventer接口:

修改MainApp如下:

package com.springboot;

import java.util.ArrayList;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;

@SpringBootApplication
public class MainApp implements WebMvcConfigurer{

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
//创建fastjson转换器实例
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//配置对象
FastJsonConfig config = new FastJsonConfig();
List<MediaType> mediaTypes = new ArrayList<>();
//中文编码
MediaType mediaType = MediaType.APPLICATION_JSON_UTF8;
mediaTypes.add(mediaType);
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
converter.setSupportedMediaTypes(mediaTypes);
converter.setFastJsonConfig(config);
converters.add(converter);
}

public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
}
启动程序:访问上面的路径:浏览器会看到如下结果:
{
"age":33,
"createTime":"2018-04-04 11:14",
"name":"张三"
}
2.使用@Bean注解注入fastjson转换器:修改MainApp如下:
[code]package com.springboot;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class App{

//SpringBoot配置自定义json解析
@Bean
public HttpMessageConverters fastJsonHttpMessageConventers(){
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
converter.setSupportedMediaTypes(mediaTypes);
converter.setFastJsonConfig(config);
HttpMessageConverter<?> converter1 = converter;
return new HttpMessageConverters(converter1);
}

/*@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
//创建fastjson转换器实例
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//配置对象
FastJsonConfig config = new FastJsonConfig();
List<MediaType> mediaTypes = new ArrayList<>();
//中文编码
MediaType mediaType = MediaType.APPLICATION_JSON_UTF8;
mediaTypes.add(mediaType);
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
converter.setSupportedMediaTypes(mediaTypes);
converter.setFastJsonConfig(config);
converters.add(converter);
}*/
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}


访问结果是一样的。但是我发现这种bean注入的方式,当controller返回中文字符串json格式时,支持不是太好,浏览器会出现乱码。也不知道是什么原因,因此还是使用的是第一种方式。



阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: