Spring Boot Web服务接口处理JSON入参时首字母大写问题的解决方案

news/2024/12/27 10:17:02 标签: spring boot, 前端, json

项目场景:

  • 在开发Spring Boot项目时,我们经常需要通过RESTful API接收来自客户端的JSON格式请求参数。然而,在某些情况下,您可能会遇到一个问题:当客户端发送的JSON字段名以大写字母开头时,Spring Boot默认的Jackson序列化/反序列化机制无法正确映射这些字段到Java对象中,导致接收不到参数。

  • 本文将介绍如何通过添加一个注解来解决这个问题,并确保Spring Boot能够正确解析首字母大写的JSON字段。


问题描述

  • 假设我们有一个简单的Java类 User,用于接收来自客户端的JSON请求:
public class User {
    private String name;
    private int age;

    // Getters and Setters
}
  • 对应的Controller方法如下:
@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/user")
    public ResponseEntity<String> createUser(@RequestBody User user) {
        return ResponseEntity.ok("Received user: " + user.getName() + ", " + user.getAge());
    }
}
  • 如果客户端发送的JSON请求如下:
json">{
  "Name": "Alice",
  "Age": 25
}

原因分析:

  • 由于JSON字段名 NameAge 首字母大写,而Java类中的字段名 nameage 是小写的,Spring Boot 默认使用 Jackson 进行反序列化时,会忽略这些字段,导致 user.getName() 和 user.getAge() 返回 null 或默认值。

解决方案一 使用 @JsonAlias 注解:

  • @JsonAliasJackson 提供的一个注解,允许为Java字段指定多个别名。这样,即使JSON字段名与Java字段名不完全匹配,Jackson也能正确映射它们。

步骤:

1、修改 User 类:为每个字段添加 @JsonAlias 注解,指定可能的JSON字段名。

import com.fasterxml.jackson.annotation.JsonAlias;

public class User {
    
    @JsonAlias({"name", "Name"})
    private String name;

    @JsonAlias({"age", "Age"})
    private int age;

    // Getters and Setters
}

2、测试:现在,无论客户端发送的JSON字段名是 name、Name、age 还是 Age,Spring Boot 都能正确解析并映射到 User 对象中。

方案二:使用 @JsonProperty 注解

  • 除了 @JsonAlias,您还可以使用 @JsonProperty 注解来显式指定JSON字段名。这对于特定字段的映射非常有用。

  • 示例:

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    
    @JsonProperty("Name")
    private String name;

    @JsonProperty("Age")
    private int age;

    // Getters and Setters
}
  • 这种方式适用于单个字段的映射,但如果需要处理多个字段或多种命名方式,@JsonAlias 可能更为灵活。

http://www.niftyadmin.cn/n/5801582.html

相关文章

pr基础(3)-lumetri

这篇应该是基础的完结篇了&#xff0c;主要记录调色方面的相关知识。 主要的内容是lumetri的使用 Lumetri的翻译其实来源于两个部分的组合。"Lume"这个词源于拉丁语&#xff0c;意为明亮度或光亮度&#xff0c;是Luminance (Luma) 的缩写&#xff0c;强调了光线的强…

运维相关知识科普

运维相关知识科普参考文章 一、运维究竟是什么 在当今数字化蓬勃发展的浪潮下&#xff0c;运维作为保障各类线上服务及产品顺畅运行的关键力量&#xff0c;其重要性不言而喻。运维&#xff0c;简言之&#xff0c;就是运用一系列专业的步骤与方法&#xff0c;对线上服务和产品…

Git多人协作流程与git命令

目录 一、拉取&#xff1a;从仓库到本地1、第一次拉取2、后续的拉取 二、上传&#xff1a;从本地到仓库三、git commit版本信息标注 一、拉取&#xff1a;从仓库到本地 1、第一次拉取 # clone项目 git clone xxx2、后续的拉取 第一次拉取是指本地为空&#xff0c;如果本地已…

git设置项目远程仓库指向github的一个仓库

要将你的Git项目设置为指向GitHub上的远程仓库&#xff0c;你需要执行以下步骤&#xff1a; 创建GitHub仓库&#xff1a; 登录到你的GitHub账户。点击右上角的 “” 号&#xff0c;选择 “New repository” 创建一个新的仓库。填写仓库的名称&#xff0c;可以添加描述&#xff…

【Python】 -- python3 读取 aws athena 表数据

目录 1、环境准备 2、安装环境 3、举例查询某张表数据和执行 add partition 操作 3.1、编辑文件 athena_jdbc.py 3.2、查找 JVM 的动态链接库路径 3.3、保存文件&#xff0c;执行以下命令 1、环境准备 oracle jdk 11centos 8依赖&#xff1a;pandas、pyathenajdbc 和 sq…

【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)

1.问题描述&#xff1a; 人脸活体检测返回上一页App由沉浸式变为非沉浸式多了上下安全区域。 解决方案&#xff1a; 检测结束后需要自己去设置沉浸式配置。 2.问题描述&#xff1a; Vision Kit文字识别是本地识别&#xff0c;还是上传至服务器&#xff0c;由服务器来识别文…

计算机网络——期末复习(4)协议或技术汇总、思维导图

思维导图 协议与技术 物理层通信协议&#xff1a;曼彻斯特编码链路层通信协议&#xff1a;CSMA/CD &#xff08;1&#xff09;停止-等待协议&#xff08;属于自动请求重传ARQ协议&#xff09;&#xff1a;确认、否认、重传、超时重传、 &#xff08;2&#xff09;回退N帧协…

Node.js 助力前端开发:自动化操作实战

前端开发中&#xff0c;重复性任务如新建文件、配置路由、生成组件等&#xff0c;往往耗时且容易出错。借助 Node.js 的强大能力&#xff0c;我们可以实现开发过程中的自动化操作&#xff0c;提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…