SpringMVC(JSON数据转换,乱码问题)

1.什么是JSON?

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。

  • 采用完全独立于编程语言的文本格式来存储和表示数据。

  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
    在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔

  • 花括号保存对象

  • 方括号保存数组

//json字符串
{
    "empno": 12,
    "ename": "yishun",
    "hiredate": "2023-12-02",
    "dept": {
        "deptno": 22,
        "dname": "研发部",
        "loc": "郑州市"
    }
}
//json数组
[
    {
        "empno": 1,
        "ename": "yishun1",
        "hiredate": "2023-12-02",
        "dept": {
            "deptno": 12,
            "dname": "财务部",
            "loc": "商丘市"
        }
    },
    {
        "empno": 2,
        "ename": "yishun2",
        "hiredate": "2025-12-02",
        "dept": {
            "deptno": 22,
            "dname": "研发部",
            "loc": "郑州市"
        }
    }
]

2.SpringMVC中Controller接收JSON数据

在前后端分离的架构之中,最为常见的数据交互格式一定使用的是JSON,用户在前端应用里面所提交的表单内容会自动拼凑为对应的JSON数据,并利用一个远程组件Axios发送给服务端,一般来讲此处的操作都是属于跨域访问的形式。如果前端发送的数据是JSON,那么就需要将这个JSON的数据转为对象的实例,那么这时候在控制层参数接收的时候就不能在简单的声明一个对象了,这个对象上需要使用到@RequestBody的注解定义。

如果要想实现此类的架构,首先就是进行JSON数据的解析
FastJSON组件(阿里开源),这个组件不是Spring推荐的组件,Spring推荐使用Jackson组件库

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.1</version>
</dependency>

如果要想使用Jackson组件,需要进行额外的配置处理,因为配置要转换的数据格式
配置Jackson组件

@Configuration
public class JacksonConfig {//JSON的配置类
    @Bean//进行请求映射的处理
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
        MappingJackson2XmlHttpMessageConverter converter =
                new MappingJackson2XmlHttpMessageConverter();
        converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));//MIME类型
        adapter.setMessageConverters(List.of(converter));//添加转换器
        return adapter;
    }
}

测试

@PostMapping("add")
    @ResponseBody
    public String add(@RequestBody Emp emp) {
        //该数据要经过Jackson组件的转换才能使用
        //Jackson组件自动把json数据解析为对象封装
        LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
                emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
        return "success";//只关注后台的输出
    }

    @PostMapping("array")
    @ResponseBody
    public String array(@RequestBody List<Emp> empList) {
        //该数据要经过Jackson组件的转换才能使用
        for (Emp emp : empList) {
            LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
                    emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
        }
        return "success";//只关注后台的输出
    }

测试add()
在这里插入图片描述
测试array()
在这里插入图片描述

3.解决JSON返回数据中文乱码

此时把add()方法返回的json信息设置为了中文

@PostMapping("add")
    @ResponseBody
    public String add(@RequestBody Emp emp) {
        //该数据要经过Jackson组件的转换才能使用
        LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
                emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
        return "成功";//只关注后台的输出
    }

Postman测试响应中文乱码
在这里插入图片描述
此时在我们的Web配置类中复写以下方法

 @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            // 解决 Controller 返回普通文本中文乱码问题
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
            // 解决 Controller 返回json对象中文乱码问题
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        }
    }

测试
在这里插入图片描述
成功解决中文乱码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当导入json文件时出现文字乱码问题,可能是由于文件的编码格式与解析方式不匹配所导致的。根据引用\[1\]中提到的情况,json串使用的是GBK编码,而cjson库默认是按照UTF-8编码解析的。因此,当遇到非UTF-8编码的字符时,就会出现乱码问题。 要解决这个问题,可以采取以下几种方法: 1. 将json文件的编码格式转换为UTF-8。可以使用文本编辑器或转码工具将文件的编码格式转换为UTF-8,确保文件中的所有字符都能正确解析。 2. 在使用cjson库解析json串时,指定正确的编码格式。可以通过修改cjson库的参数或使用相关的解析函数来指定使用GBK编码进行解析,以保证字符能够正确地转换为LUA本地的数据结构。 3. 在项目中进行全局文字格式的设置。根据引用\[2\]中提到的方法,可以通过修改项目的配置文件来设置全局的文字格式,确保解析json时能够正确处理各种编码格式。 至于为什么会出现"朶"等字的乱码问题,根据引用\[3\]中的解释,cjson库对非UTF-8编码的字符不做任何检查,直接放过。因此,当遇到非UTF-8编码的字符时,就会出现乱码问题。这也说明了为什么使用GBK编码会导致部分字符出现乱码的情况。 综上所述,要解决导入json文件文字乱码问题,可以通过转换文件编码格式、指定正确的解析方式或进行全局文字格式的设置来解决。 #### 引用[.reference_title] - *1* *3* [JSON数据乱码问题](https://blog.csdn.net/weixin_42151036/article/details/113571128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringMVCJSON工具:Jackson Gson 和fastjson通过JSON工具来解决文字乱码和时间格式问题——通过JSON工具...](https://blog.csdn.net/m0_52479012/article/details/129254016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值