【开发情景】数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端

数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端
  • 方法一(最详细):
    • 一、解析JSON数据:使用 `JSON` 库将字符串解析为 `Map`。
      • 1、从数据库读取 `JSON` 字符串:
      • 2、使用 `Jackson` 库解析 `JSON`:
      • 3、然后在代码中使用 `ObjectMapper` 来解析 `JSON` 数据:
    • 二、键值转换:遍历 `Map`,将中文键替换为相应的英文键。
      • 1、定义键值转换的映射:
      • 2、遍历并转换 `Map`:
    • 三、返回给前端
      • 1、在 Spring Boot 中返回 JSON:
      • 2、前端接收和处理 JSON 数据:
  • 方法二(遍历,最容易理解):
  • 方法三(最简单,反序列化时使用注解映射)
    • 一、定义 User 类并使用注解:
    • 二、在控制器中返回 User 对象:
    • 三、前端接收和处理 JSON 数据:

要将数据库中的JSON数据转换为Map并且将其中的中文键值转换为英文键值,从数据库中取出来主要是一个String类型的值。建议使用方法三。

方法一(最详细):

一、解析JSON数据:使用 JSON 库将字符串解析为 Map

1、从数据库读取 JSON 字符串:

假设你从数据库中读取了一段 JSON 字符串,它代表一个对象的属性。例如:

{"名称": "张三","年龄": 30,"性别": "男"
}
2、使用 Jackson 库解析 JSON

在 Java 中,使用 Jackson 库可以很方便地将 JSON 字符串解析为 Map<String, Object>。首先,你需要导入 Jackson 库。

<!-- Maven 依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.0</version>
</dependency>
3、然后在代码中使用 ObjectMapper 来解析 JSON 数据:

关于ObjectMapper的详细使用参考

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;public class JsonParser {public Map<String, Object> parseJson(String jsonString) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 将 JSON 字符串解析为 Map<String, Object>Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});return map;}
}

二、键值转换:遍历 Map,将中文键替换为相应的英文键。

1、定义键值转换的映射:

先定义一个 Map<String, String> 来存储中文键和英文键的映射关系。

public class KeyTranslator {private static final Map<String, String> keyMap = new HashMap<>();static {keyMap.put("名称", "name");keyMap.put("年龄", "age");keyMap.put("性别", "gender");// 可以继续添加更多的键值对映射}public static String translateKey(String chineseKey) {return keyMap.getOrDefault(chineseKey, chineseKey); // 如果找不到映射,保持原样}
}
2、遍历并转换 Map

遍历原始的 Map<String, Object>,将中文键替换为英文键,并生成一个新的 Map

public class MapTransformer {public Map<String, Object> transformKeys(Map<String, Object> originalMap) {Map<String, Object> translatedMap = new HashMap<>();for (Map.Entry<String, Object> entry : originalMap.entrySet()) {String translatedKey = KeyTranslator.translateKey(entry.getKey());translatedMap.put(translatedKey, entry.getValue());}return translatedMap;}
}

三、返回给前端

1、在 Spring Boot 中返回 JSON:

通过控制器将处理后的 Map 直接返回给前端。Spring Boot 会自动将 Map 转换为 JSON 格式。

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/user")public Map<String, Object> getUserData() throws Exception {...Map<String, Object> translatedMap = transformer.transformKeys();...// 返回给前端return translatedMap;}
}
2、前端接收和处理 JSON 数据:

前端通过 AJAX 或 fetch 请求获取这个 JSON 数据,并处理显示。

fetch('/api/user').then(response => response.json()).then(data => {console.log(data.name); // 输出 "张三"console.log(data.age);  // 输出 30console.log(data.gender); // 输出 "男"});

方法二(遍历,最容易理解):

保存转换后的数据:根据需要将转换后的Map重新保存或进一步处理。

以下是Java示例代码:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.HashMap;
import java.util.Map;public class JsonKeyTranslator {public static void main(String[] args) throws Exception {// 假设从数据库中读取的JSON字符串String jsonData = "{"名称":"张三", "年龄":25, "性别":"男"}";// 创建ObjectMapper实例ObjectMapper objectMapper = new ObjectMapper();// 将JSON字符串解析为MapMap<String, Object> originalMap = objectMapper.readValue(jsonData, new TypeReference<Map<String, Object>>() {});// 创建一个新的Map存储转换后的键值对Map<String, Object> translatedMap = new HashMap<>();// 键值转换逻辑for (Map.Entry<String, Object> entry : originalMap.entrySet()) {String key = entry.getKey();Object value = entry.getValue();// 根据键值进行翻译(这里简单映射,实际可使用更复杂的映射逻辑)String translatedKey = translateKey(key);// 将翻译后的键值对放入新的MaptranslatedMap.put(translatedKey, value);}// 输出转换后的MapSystem.out.println(translatedMap);}// 简单的中文键值到英文键值的映射方法private static String translateKey(String chineseKey) {switch (chineseKey) {case "名称":return "name";case "年龄":return "age";case "性别":return "gender";// 添加更多映射规则default:return chineseKey; // 没有匹配到的键,保持原样}}
}

示例输出:
假设输入的JSON是 {"名称":"张三", "年龄":25, "性别":"男"}
输出结果为 {"name":"张三", "age":25, "gender":"男"}。

方法三(最简单,反序列化时使用注解映射)

使用注解的方法可以在对象序列化和反序列化时直接完成键值的转换,避免手动遍历和映射。通过使用 Jackson 的注解,如 @JsonProperty@JsonAlias,可以直接将 JSON 中的中文键映射到对象的字段上,再以对象的形式返回给前端。
关于 @JsonProperty@JsonAlias 的更多了解参考---->【注解】@JsonProperty 详解
,【注解】@JsonAlias 详解
示例:使用注解直接在 ObjectMapper 映射时做转换

一、定义 User 类并使用注解:

在 User 类中,使用 @JsonProperty 注解来指定 JSON 键与类字段之间的映射关系。

import com.fasterxml.jackson.annotation.JsonProperty;public class User {@JsonProperty("名称")private String name;@JsonProperty("年龄")private int age;@JsonProperty("性别")private String gender;// Getters and Setterspublic 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 String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}
}

@JsonProperty 注解:这个注解告诉 Jackson,在序列化和反序列化时,应该使用指定的 JSON 键来对应类中的字段。这样你就不需要手动编写键值映射逻辑了。
自动转换:当 Jackson 解析 JSON 数据或将对象转换为 JSON 时,会自动处理这些映射,将 JSON 中的中文键正确地映射到类的字段上。

二、在控制器中返回 User 对象:

在控制器中,直接将 User 对象返回给前端,Spring Boot 会自动将其序列化为 JSON。

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/user")public User getUser() {// 模拟从数据库中获取数据并手动构建 User 对象User user = new User();user.setName("张三");user.setAge(30);user.setGender("男");return user;  // 直接返回对象,Spring Boot 自动序列化为 JSON}
}

三、前端接收和处理 JSON 数据:

前端通过 fetch 或其他方式获取返回的 JSON 数据。

fetch('/api/user').then(response => response.json()).then(data => {console.log(data.name);   // 输出 "张三"console.log(data.age);    // 输出 30console.log(data.gender); // 输出 "男"});

方法三的优势:
减少代码复杂性:通过注解,省去了手动编写转换逻辑的需求,代码更加简洁。
增强可读性:注解直接在类的字段上定义,使得映射关系一目了然,维护性更好。
直接返回对象:可以直接返回对象给前端,前端无需处理额外的键值映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js 里面的许多对象都会分发事件&#xff1a;一个 net.Server 对象会在每次有新连接时触发一个事件&#xff0c; 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都…

SpringBoot 项目使用 EasyExcel 插件构建 Excel 表格格式(行高、列宽和字体等)工具类

本文主要讲了如何使用 EasyExcel 插件&#xff0c;在导出 Excel 时&#xff0c;设置行高&#xff0c;列宽&#xff0c;表头格式&#xff0c;内容字体大小等工具类。 1、代码使用的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyex…

Ubuntu18安装后基本配置操作

1. 关掉自动更新 不关掉自动更新&#xff0c;会将你的ubuntu系统更新到更高版本&#xff0c;一些配置就不能用了&#xff0c;所以要关掉自动更新。在“软件和更新”中将“自动检查更新”设置为从不。 2. ubuntu换国内源 参考链接换源 按照这个换源这个换源好使 &#xff0c;…

《探索C++在3D重建中的算法与技术要点》

3D重建作为计算机视觉领域的重要技术&#xff0c;在诸多行业有着广泛应用&#xff0c;而C以其高效性和对底层硬件的良好控制&#xff0c;成为实现3D重建算法的常用语言。以下是利用C进行3D重建的一些常见算法和技术要点。 多视图立体视觉算法 多视图立体视觉是3D重建的基础算…

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一&#xff0c;自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop&#xff0c;从其起源、核心架构、关键组件&#xff0c;到典型应用场景&#xff0c;并结合代码示例和图示&#xff0c;帮助您更好地掌握Hadoop的实战…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…

Django 与 Flask 框架深度剖析

一、框架概述 起源与发展 Django&#xff1a; 诞生于新闻应用开发环境&#xff0c;旨在快速构建复杂、数据库驱动的网站。由 Django 软件基金会维护&#xff0c;拥有庞大的社区支持&#xff0c;持续更新迭代。其发展遵循稳定、功能丰富的路线&#xff0c;注重安全性与可扩展性的…

JAVA:建造者模式(Builder Pattern)的技术指南

1、简述 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍建…

MFC改变对话框控件字体

代码如下,加到对话框的OnInitDialog()成员函数, CButton* pButton = (CButton*)GetDlgItem(IDOK);LOGFONT lf;ZeroMemory(&lf, sizeof(LOGFONT));lf.lfHeight = 25; // 字体高度lf.lfWidth = 0; // 字体平均宽度lf.lfEscapement = 0…

GESP202412 四级【Recamán】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 四级] Recamn 题目描述 小杨最近发现了有趣的 Recamn 数列&#xff0c;这个数列是这样生成的&#xff1a; 数列的第一项 a 1 a_1 a1​ 是 1 1 1&#xff1b;如果 a k − 1 − k a_{k-1}-k ak−1​−k 是正整数并且没有在数…

「数据结构详解·十五」树状数组

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…

如何通过python实现一个web自动化测试框架?

一、首先你得知道什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver和Selenium Grid。 Selenium IDE&#…

在python中使用“while”和“for”循环

编写代码时&#xff0c;一个常见的难题是让其执行未知次数的任务。 在本单元中&#xff0c;你希望允许用户输入行星名称列表。 遗憾的是&#xff0c;你不知道用户输入了多少名称。 若要支持次数未知的循环&#xff0c;可以使用 while 循环。 while 循环在当某个条件为 true 时…

[Rust开发]actix_web::middleware 中间件

actix_web::middleware 在 Actix Web 框架中扮演着重要的角色&#xff0c;它允许开发者在处理 HTTP 请求和响应的过程中插入自定义的逻辑。中间件可以在请求到达处理函数之前或响应返回给客户端之前执行&#xff0c;从而实现日志记录、身份验证、数据验证、错误处理等功能。 为…

如何使用 Python 发送 HTTP 请求?

在Python中发送HTTP请求最常用的库是requests&#xff0c;它提供了简单易用的API来发送各种类型的HTTP请求。 除此之外&#xff0c;还有标准库中的http.client&#xff08;以前叫做httplib&#xff09;和urllib&#xff0c;但它们相对更底层&#xff0c;代码量较大&#xff0c…

C++ 中面向对象编程如实现数据隐藏

在C中&#xff0c;面向对象编程&#xff08;OOP&#xff09;通过封装&#xff08;Encapsulation&#xff09;来实现数据隐藏。封装是OOP的一个核心概念&#xff0c;它允许将对象的属性和行为&#xff08;即数据和方法&#xff09;组合在一起&#xff0c;并对外隐藏对象的内部实…

opencv——图片矫正

图像矫正 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 听名字有点熟&#xff0c;我们在图像旋转里接触过仿射变换&#xff0c;知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程&#xff0c;转换过程坐标点的相对位置和属性不发生变换&a…

OpenCV中的边缘检测和轮廓处理

在图像处理和计算机视觉任务中&#xff0c;边缘检测和轮廓处理是非常重要的步骤。OpenCV库提供了多种函数来实现这些功能&#xff0c;包括Sobel算子、Laplacian算子、Canny算子、findContours函数、drawContours函数以及透视变换函数等。本文将详细介绍这些函数的功能、参数、返…

flex 弹性布局 笔记

<style> /* flex-direction &#xff08;即项目的排列方向&#xff09; flex-wrap &#xff08;换行&#xff09; flex-flow &#xff08; flex-direction属性和flex-wrap属性的简写形式&#xff09; justify-content &#xff08;项目的对齐方向&#xff09;主轴…

解决vue2中更新列表数据,页面dom没有重新渲染的问题

在 Vue 2 中&#xff0c;直接修改数组的某个项可能不会触发视图的更新。这是因为 Vue 不能检测到数组的索引变化或对象属性的直接赋值。为了确保 Vue 能够正确地响应数据变化&#xff0c;你可以使用以下几种方法&#xff1a; 1. 使用 Vue.set() 使用 Vue.set() 方法可以确保 …