8.返回JSON数据(Jackson):【@Controller + @ResponseBody 等价于【@RestController】的使用方法 jackson乱码的xml配置

article/2025/10/28 1:32:34

文章目录

  • Controller类,返回JSON数据(Jackson)【一个不乱码的对象】
    • 1. 使用Jackson,需要额外导入pom依赖:jackson-databind
    • 2. 配置web.xml:注册DispatcherServlet、自带的过滤器
    • 3. 配置springmvc-servlet.xml 【含jackson乱码的解决配置】
    • 4. 编写一个User的实体类
    • 5. 在Artifacts中导入lib
    • 6. 在com.kuang.controller包下,创建 UserController类
      • ==方法一:使用 @Controller + @ResponseBody==
      • ==方法二:@RestController:类下的返回值只会返回字符串【推荐使用】==
  • 扩展
    • 1. 输出数组对象(即多个对象)
    • 2.输出时间对象
      • 第一种方法:【java代码,容易理解】
      • 第二种方法
      • 第三种方式: 抽取为工具类JsonUtils

Controller类,返回JSON数据(Jackson)【一个不乱码的对象】

Jackson应该是目前比较好的json解析工具了

当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等。

1. 使用Jackson,需要额外导入pom依赖:jackson-databind

<!--jackson依赖-json解析工具-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency>		

2. 配置web.xml:注册DispatcherServlet、自带的过滤器

<servlet><!--配置DispatcherServlet:这是个springmvc的核心:请求分发器,请前端控制器--><servlet-name>spring-mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--DispatcherServlet要绑定spring配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><!--启动级别 1 数字越小,启动越早--><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><!-- / 匹配所有的请求:(不包括jsp)--><!-- /* 匹配所有的请求:(包括jsp)  不要用这个会404--><servlet-name>spring-mvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping><!--配置SpringMVC的中文乱码过滤-->
<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>encoding</filter-name><!--/ 匹配所有的请求:(不包括jsp)--><!--/* 匹配所有的请求:(包括jsp)--><url-pattern>/*</url-pattern>
</filter-mapping>

3. 配置springmvc-servlet.xml 【含jackson乱码的解决配置】

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--自动扫描包,让指定包下的注解生效,有IOC容器统一管理--><context:component-scan base-package="com.kuang.controller"/><mvc:default-servlet-handler /><!--支持mvc注解驱动在spring中一般采用@RequestMapping注解来完成映射关系要想使@RequestMapping注解生效必须向上下文中注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例这两个实例分别在类级别和方法级别处理。而annotation-driven配置帮助我们自动完成上述两个实例的注入。--><mvc:annotation-driven /><!--解决返回字符串(JSON)中文乱码问题配置--><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean>
</beans>

4. 编写一个User的实体类

package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//需要导入lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String name;private int age;
}



5. 在Artifacts中导入lib



6. 在com.kuang.controller包下,创建 UserController类

这里我们需要两个新东西,一个是@ResponseBody,一个是ObjectMapper对象,我们看下具体的用法

方法一:使用 @Controller + @ResponseBody

@ResponseBody:不会走视图解析器,会返回一个字符串

@Controller
public class UserController {@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")//prodeces后面的,能防止乱码@ResponseBodypublic String json1() throws JsonProcessingException {//创建一个对象User user = new User(3,"张三",18);
//        Jackson-json解析工具,对象转为json格式ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);return json;}}

在这里插入图片描述

方法二:@RestController:类下的返回值只会返回字符串【推荐使用】

@RestController效果相当于@Controller配合@ResponseBody

@RestController//类下的返回值只会返回字符串,效果相当于@Controller配合@ResponseBody
public class UserController {//produces可不要@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")public String json1() throws JsonProcessingException {//创建一个对象User user = new User(3,"张三",18);//Jackson-json解析工具,对象转为json格式ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);return json;//返回值简写为一行 new ObjectMapper().writeValueAsString(user);}
}

使用方法二,要在springmvc-servlet.xml加上下面代码,否认中文会乱码

<!--解决返回字符串(JSON)中文乱码问题配置--><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven>

在这里插入图片描述



扩展

1. 输出数组对象(即多个对象)

@RequestMapping("/j2")public String json2() throws JsonProcessingException {//创建对象User user1 = new User(3,"张三1",18);User user2 = new User(3,"张三2",18);User user3 = new User(3,"张三3",18);//创建集合,并把对象放入集合List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);userList.add(user3);//Jackson-json解析工具,对象转为json格式ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(userList);return json;//返回值简写为一行 new ObjectMapper().writeValueAsString(userList);}

在这里插入图片描述



2.输出时间对象

第一种方法:【java代码,容易理解】

ObjectMapper解析时间对象后会转换为默认格式Timestamp:时间戳(时间戳是北京时间1970年01月01日08时00分00秒起现在的总毫秒数):先自定义定日期格式并把日期对象转换为日期字符串日期字符串转为json字符串。

   //1.java方式获取时间对象格式转换为json字符串@RequestMapping(value = "/j3")public static String json3() throws JsonProcessingException {//Jackson-json解析工具,对象转为json格式//ObjectMapper解析时间对象后会转换为默认格式Timestamp:时间戳(时间戳是北京时间1970年01月01日08时00分00秒起至现在的总毫秒数)ObjectMapper mapper = new ObjectMapper();//获取当前日期Date date = new Date();//自定义日期的格式:如果不自定义日期格式用ObjectMapper解析时间后会转换为默认格式Timestamp:// 时间戳(时间戳是北京时间1970年01月01日08时00分00秒起至现在的总毫秒数)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//当前日期格式字符串String dateFormat = sdf.format(date);//转换为json字符串日期格式String jsonDate = mapper.writeValueAsString(dateFormat);return jsonDate;}

在这里插入图片描述



第二种方法

把ObjectMapper解析时间对象后会转换为默认格式Timestamp:时间戳关闭,并为ObjectMapper设置指定日期格式,把当前日期对象转换为指定日期格式json字符串

    @RequestMapping(value = "/j4")public String json4() throws JsonProcessingException {//Jackson-json解析工具,对象转为json格式ObjectMapper mapper = new ObjectMapper();//不使用时间戳的方式,默认使用时间戳,改为false不使用时间戳,mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//自定义日期格式对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//ObjectMapper设置指定日期格式mapper.setDateFormat(sdf);//获取当前日期Date date = new Date();String json = mapper.writeValueAsString(date);return json;}



第三种方式: 抽取为工具类JsonUtils

如果要经常使用的话,可以将这些代码封装到一个工具类中

com.kuang.utils包下

//json日期格式工具
//json日期格式工具
public class JsonUtils {//方法重载使用:只传一个参数public static String getJson(Object object){//返回格式为"yyyy-MM-dd HH:mm:ss"return getJson(object,"yyyy-MM-dd HH:mm:ss");}//传日期对象和日期格式public static String getJson(Object object,String dateFormat){ObjectMapper objectMapper = new ObjectMapper();//不使用时间戳的方式,默认使用时间戳,改为false不使用时间戳,objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//把传来的日期格式放入SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);//把传来的对象设置为指定日期格式objectMapper.setDateFormat(sdf);try {return objectMapper.writeValueAsString(object);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}
}

com.kuang.controller包下编写方法

    //使用自己写的Json工具类@RequestMapping(value = "/j5")public String json5() throws JsonProcessingException {//获取当前日期Date date = new Date();//自定义格式:传两个值//String json = JsonUtil.getJson(date, "yyyy-MM-dd HH:mm:ss");//传一个值默认格式为"yyyy-MM-dd HH:mm:ss"String json2 = JsonUtils.getJson(date);return json2;}

http://chatgpt.dhexx.cn/article/B1BfqETQ.shtml

相关文章

SpringBoot默认使用Jackson,它与ObjectMapper的前世今生JSON工具(格式化、JSONObject转对象)

Jackson与ObjectMapper 1、Jackson可以轻松地将Java对象转换成json对象和xml文档&#xff0c;同样也可以将json、xml转换成Java对象&#xff1b; 2、ObjectMapper类是Jackson库的主要类。它称为ObjectMapper的原因是因为它将JSON映射为Java对象&#xff08;序列化&#xff09…

Json☀️ 二、使用 JsonUtility 创建并解析 Json

文章目录 &#x1f7e5; 要生成的 Json&#x1f7e7; 创建 Json 方法&#x1f7e8; 解析 Json 方法 在我们项目中&#xff0c;可能经常用到解析 Json&#xff0c; 但有时也需要存档的工作。那该怎样生成Json呢&#xff1f; 下面我们就以上节 Json 例子为例&#xff0c;来讲解如…

Jackson API指南(*)

一.Jackson 概述 与 依赖 1.市面上用于在 Java 中解析 Json 的第三方库&#xff0c;随便一搜不下几十种&#xff0c;其中的佼佼者有 Google 的 Gson&#xff0c; Alibaba 的 Fastjson以及本文的 jackson。 2.我们在学习一门技术之前&#xff0c;首选要了解这门技术的优劣性&am…

Jackson 工具类使用及配置指南

目录 前言Jackson使用工具类Jackson配置属性Jackson解析JSON数据Jackson序列化Java对象 前言 Json数据格式这两年发展的很快&#xff0c;其声称相对XML格式有很对好处&#xff1a; 容易阅读&#xff1b;解析速度快&#xff1b;占用空间更少。 不过&#xff0c;JSON 和 XML…

docker 命令(2) 容器数据持久化

1. docker ps 查看所有运行状态的容器. 2.docker ps -a 查看全部状态的容器列表。 3. docker rmi image名字 删除一个镜像。 4.容器持久化&#xff1a; 这样的话容器即使删了 但是数据依然在 主机的目录未指定的话 默认就会给你建一个 docker run --name mysql_pro -p 330…

jprofiler 连接 docker中的jvm

jprofiler 官网&#xff1a; Java Profiler - JProfiler 1: docker-compose 指定端口&#xff0c; docker 为 -p 指定端口 2&#xff1a;官网下载 liunx版本及windows版本&#xff1a; 我用的是12.0.4 windows本地 win10安装 liunx 版本 上传是liun服务器 3&#xff1a; 在…

Java中Jackson库操作json的基本操作

这段工作中总会遇到使用Java处理JSON的情况&#xff0c;大部分都使用的是开源工具Jackson实现的。因此总结一下发上来&#xff0c;希望对看到的人有所帮助。 上一篇文档中&#xff0c;我已经讲过Java如何使用Jackson来对Json进行序列化&#xff0c;这边我再稍微回顾一下。 Ja…

java操作k8s api示例:通过java完成对kubenetes原生资源对象(pod、node、namespace、servcie、deployment)和自定义资源对象CRD的增删改查或事件监听

本文目标 基于官方kubernetes-client/java类库&#xff0c;实现通过java完成对kubenetes原生资源对象&#xff08;pod、node、namespace、servcie、deployment&#xff09;和自定义资源对象&#xff08;如&#xff1a;cluster&#xff09;的增删改查或事件监听&#xff08;wat…

Jackson注解 @JsonCreator

当json在反序列化时&#xff0c;默认选择类的无参构造函数创建类对象&#xff0c;当没有无参构造函数时会报错&#xff0c;JsonCreator作用就是指定反序列化时用的无参构造函数。构造方法的参数前面需要加上JsonProperty,否则会报错。 JsonCreatorpublic Person(JsonProperty(&…

Spring中读取本地json文件,并交给Spring容器管理

我们经常在项目开发中遇到项目数据初始化的问题&#xff0c;例如一些超管&#xff0c;管理员账号&#xff1b;或者地图包&#xff0c;电话号码包&#xff0c;之类的东西。放到到一个json文件里面&#xff08;大的数据字典包可以放到搜索引擎里面&#xff0c;改情况本文不做讨论…

导入jackson-databind依赖后tomcat报错Cannot resolve com.fasterxml.jackson.core:jackson-databind

1》解决步骤&#xff1a; 项目启动前先打开tomcat里面的conf里面的catalina.properties文件夹 如&#xff1a;apache-tomcat-8.5.83\conf\catalina.properties 后面在里面找到如下&#xff1a;红线处 往下找到如下&#xff1a; 将上面的 红波浪线内容添加到后面&#xff1a…

通过Kettle工具解析Json接口数据并且保存到数据库中的详细操作

最近接到一个业务需求&#xff0c;要把一个Json接口数据获取下来并且保存到数据库中&#xff0c;考虑到应用代码实现功能需要耗费一定时间和精力&#xff0c;一旦需要修改&#xff0c;就得重启项目等。于是就选择利用Kettle工具来实现这个业务功能&#xff0c;将其从项目源码中…

树莓派安装wiringpi显示不存在解决方法

环境&#xff1a;树莓派4B 使用sudo apt-get install wiringpi 指令安装wiringpi包时&#xff0c;出现下面的提示&#xff1a; Reading package lists... Done Building dependency tree... Done Reading state information... Done Package wiringpi is not available, but …

[ARM+Linux] 基于wiringPi库的串口通信

wiringOP-master/examples/serialTest.c中&#xff0c;wiringPi库中自带的串口程序&#xff1a; #include <stdio.h> #include <string.h> #include <errno.h>#include <wiringPi.h> #include <wiringSerial.h>int main () {int fd ;int count …

树莓派 Raspberry Pi —— wiringPi库安装

树莓派的GPIO可以像单片机&#xff08;51单片机&#xff0c;Arduino&#xff0c;STM32等&#xff09;一样进行IO控制&#xff08;输出高、低电平&#xff0c;IIC&#xff0c;SPI&#xff0c;串口通信&#xff0c;PWM输出等&#xff09;&#xff0c;在此使用常用的WiringPi库来进…

树莓派 wiringPi 库

wiringPi是一个很棒的树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程&#xff0c;等等 检查树莓派是否已安装 wiringPi&#xff0c;在树莓派终端输入&#xff1a; gpio -v // 会在终端中输出…

树莓派安装wiringPi

在学习微雪的2-CH CAN FD HAT时&#xff0c;根据官网步骤在树莓派安装wiringPi sudo apt-get install wiringpi #对于树莓派4B可能需要进行升级&#xff1a; wget https://project-downloads.drogon.net/wiringpi-latest.deb&#xff08;此链接安装可能出错&#xff0c;如果出…

解决wiringPi库与64位树莓派之间不兼容的问题

目录 一.问题现象&#xff1a; 二.解决方案&#xff08;网站&#xff09;可以直接点这下载 一.问题现象&#xff1a; 今天在练习wiringPi库的使用时候&#xff0c;在最后编译的时候出现了这个问题 主要问题是这个skipping incompatible&#xff01; skipping incompatible. …

树莓派安装WiringPi以及找不到wiringPi.h文件解决方法(图文教程)

目录 安装WiringPi 失败的过程&#xff1a; 选择的方法&#xff1a; 安装步骤&#xff1a; 找不到wiringPi.h文件解决方法 失败过程&#xff1a; 解决方法&#xff1a; 安装WiringPi 失败的过程&#xff1a; 通过分别使用sudo apt-get install wiringPi 和 wget https…

树莓派的wiringPi库

一、wiringPi库 树莓派的外设开发都是基于wiringPi库&#xff0c;wiringPi是树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程&#xff0c;等等。 wiringPi库的安装 进入 wiringPi的github (htt…