Springboot之输出json数据

本文介绍如何在SpringBoot项目中使用Lombok简化实体类编写,并通过两种方式配置FastJSON替换默认的Jackson作为JSON处理器,实现更高效的数据转换。

接着上一篇的helloworld来说:

 

可以在pom文件中引入lombok.jar

省去set,get代码

 

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

 

 

 

重新建一个实体类:User

属性:id,name

当然还有其他的,比如

@Getter

@Setter

@RequiredArgConstructor

@ToString

@EqualsAndHashCode

toString都可以省略

 

然后再在HelloController类中写一个方法:

@RequestMapping("/getUser")
	public User getUser(){
		User user = new User();
		user.setId(1);
		user.setName("张三");
		return user;
	}

再次启动访问localhost:8080/getUser  就可以看到json数据了

Springboot默认的使用jackson来处理json数据的,如果我们不想用它默认的,想用fastJson怎么办呢?下面我们就来用下阿里的fastjson处理一下

首先导入fastjson.jar包,版本1.2.10+,根据官方文档说明

第一种方式:

App启动类继承extendsWebMvcConfigurerAdapter

重写:configureMessageConverters 方法

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//		super.configureMessageConverters(converters);
//		
//		/*
//		 * 1、需要先定义一个 convert 转换消息的对象;
//		 * 2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
//		 * 3、在convert中添加配置信息.
//		 * 4、将convert添加到converters当中.
//		 * 
//		 */
//		
//		// 1、需要先定义一个 convert 转换消息的对象;
//		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//		
//		//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
//		FastJsonConfig fastJsonConfig = new FastJsonConfig();
//		fastJsonConfig.setSerializerFeatures(
//                SerializerFeature.PrettyFormat
//        );
//		
//		//3、在convert中添加配置信息.
//        fastConverter.setFastJsonConfig(fastJsonConfig);
//        
//        //4、将convert添加到converters当中.
//    	converters.add(fastConverter);
//		
//	}


此时可以在增加一个属性:日期date

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

再次启动访问,此时就是使用了fastjson来处理数据的

第二种方式:

在启动类中 注入Bean : HttpMessageConverters

@Bean
	public HttpMessageConverters fastJsonHttpMessageConverters() {
		// 1、需要先定义一个 convert 转换消息的对象;
		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
		//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
		FastJsonConfig fastJsonConfig = new FastJsonConfig();
		fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
		//3、在convert中添加配置信息.
		fastConverter.setFastJsonConfig(fastJsonConfig);
		HttpMessageConverter<?> converter = fastConverter;
		return new HttpMessageConverters(converter);
	}

另外注入的这种方式,解决中文乱码的问题,加入如下代码:

List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fasHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);

完整版:

@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
    //1. 需要定义一个converter转换消息的对象
    FastJsonHttpMessageConverter fasHttpMessageConverter = new FastJsonHttpMessageConverter();

    //2. 添加fastjson的配置信息,比如:是否需要格式化返回的json的数据
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    //2-1处理中文乱码问题
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    fasHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
    //3. 在converter中添加配置信息
    fasHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    HttpMessageConverter<?> converter = fasHttpMessageConverter;
    return new HttpMessageConverters(converter);

可以达到同样的效果

 

在 Spring Boot 应用中接收 JSON 数据时,如果不使用实体类进行反序列化,可以借助 `ObjectNode` 来处理动态结构的 JSON 输入。这种方式特别适用于字段不确定、嵌套结构复杂或需要灵活解析的情况。 ### 接收 JSON 数据并解析为 `ObjectNode` Spring MVC 支持直接将请求体解析为 `JsonNode` 或其子类 `ObjectNode`,前提是配置了 Jackson 作为默认的 HTTP 消息转换器。可以通过以下方式定义控制器方法: ```java @PostMapping("/process") public ResponseEntity<String> processJson(@RequestBody ObjectNode payload) { String name = payload.get("name").asText(); int age = payload.get("age").asInt(); // 获取嵌套对象 JsonNode addressNode = payload.get("address"); if (addressNode instanceof ObjectNode) { String city = ((ObjectNode) addressNode).get("city").asText(); System.out.println("City: " + city); } return ResponseEntity.ok("Received: name=" + name + ", age=" + age); } ``` 该方法能够接收任意符合 JSON 格式的输入,并通过 `ObjectNode` 提供的方法访问具体字段,而无需提前定义 Java 实体类 [^2]。 ### 手动解析 JSON 字符串为 `ObjectNode` 如果需要在业务逻辑内部手动解析字符串形式的 JSON 数据,可以使用 `ObjectMapper` 构建 `ObjectNode` 实例: ```java String jsonInput = "{\"name\":\"Alice\",\"age\":25,\"address\":{\"city\":\"Beijing\"}}"; ObjectMapper mapper = new ObjectMapper(); ObjectNode parsed = (ObjectNode) mapper.readTree(jsonInput); String name = parsed.get("name").asText(); // Alice int age = parsed.get("age").asInt(); // 25 // 访问嵌套对象 ObjectNode address = (ObjectNode) parsed.get("address"); String city = address.get("city").asText(); // Beijing ``` 此方式适用于从外部来源(如文件数据库、消息队列)获取的原始 JSON 数据,需结合上下文进行灵活处理 [^2]。 ### 动态构建和修改 JSON 结构 除了接收和解析 JSON 数据,`ObjectNode` 还支持以编程方式动态构建和修改 JSON 对象结构: ```java ObjectMapper mapper = new ObjectMapper(); ObjectNode result = mapper.createObjectNode(); result.put("status", "success"); result.put("code", 200); ObjectNode data = mapper.createObjectNode(); data.put("id", 123); data.put("username", "user1"); result.set("data", data); String jsonResponse = mapper.writeValueAsString(result); System.out.println(jsonResponse); ``` 输出结果: ```json { "status": "success", "code": 200, "data": { "id": 123, "username": "user1" } } ``` 这种能力使得 `ObjectNode` 成为处理非固定结构数据的理想选择,例如用于构建 API 响应、中间层数据转换或日志记录等场景 [^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值