当前位置: 首页 > news >正文

java要防止重复序列化的问题JSON.toJSONString转义问题

要防止重复序列化的问题JSON.toJSONString(entity)

20241213 10:29

背景:

我在设计业务实现echart图标渲染,业务接口实时性查询耗时很长,为了提高系统可用性和用户体验,采用中间表的方案——即在中间表中存储大JSON。
但是在自测环节发现数据库中的json串格式有被多次序列化JSON.toJSONString(entity) 。疑惑了 所以就去看了下同事相关的业务接口 ,不得了 同事写的接口有的加了JSON.toJSONString序列化, 有的没加,简直就是坑啊。我怎么确定他有没有序列化啊,总不至于每个都判断一次吧…不管了,直接兜底处理吧,又称shi上堆shi。

他这种写法 直接导致,我在获取解析json的时候会有格式报错,因为无法确定到底被序列化了几次!

具体解决方案如下:

Q、

我要存储json字符串到mysql text字段中。代码使用JSON.toJSONString(entity) ,可能entity本身就是json字符串格式,为了防止两次toJSONString的情况 怎么处理。

在这里插入图片描述

A、

在存储 JSON 字符串到 MySQL 的 TEXT 字段时,确实需要防止重复序列化的问题。如果 entity 本身已经是 JSON 字符串,再次使用 JSON.toJSONString() 会导致转义符等问题。

解决方案

在调用 JSON.toJSONString() 之前,可以先检查 entity 是否已经是一个合法的 JSON 字符串。以下是两种常见方法:


方法 1:使用 JSONValidator 验证

JSONValidator 是 FastJSON 提供的工具,用于验证字符串是否是合法的 JSON 格式。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator;public class JsonStorageExample {public static String ensureJsonString(Object entity) {if (entity instanceof String) {String jsonString = (String) entity;// 验证是否是合法的 JSON 字符串if (JSONValidator.from(jsonString).validate()) {return jsonString; // 已是 JSON 字符串,无需再次序列化}}// 对非字符串类型或非合法 JSON 字符串的对象进行序列化return JSON.toJSONString(entity);}public static void main(String[] args) {// 示例Object entity1 = "{\"key\":\"value\"}"; // 已经是 JSON 字符串Object entity2 = new JSONObject(); // 非 JSON 字符串((JSONObject) entity2).put("key", "value");System.out.println(ensureJsonString(entity1)); // 输出:{"key":"value"}System.out.println(ensureJsonString(entity2)); // 输出:{"key":"value"}}
}

方法 2:手动判断是否是 JSON 格式

如果不想引入 JSONValidator,可以通过捕获异常的方式简单判断:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class JsonStorageExample {public static String ensureJsonString(Object entity) {if (entity instanceof String) {String jsonString = (String) entity;try {// 尝试解析字符串为 JSON 对象JSON.parse(jsonString);return jsonString; // 如果解析成功,说明是合法 JSON} catch (Exception e) {// 如果解析失败,说明不是合法 JSON,继续序列化}}// 对非字符串类型或非合法 JSON 字符串的对象进行序列化return JSON.toJSONString(entity);}public static void main(String[] args) {Object entity1 = "{\"key\":\"value\"}"; // 已经是 JSON 字符串Object entity2 = new JSONObject(); // 非 JSON 字符串((JSONObject) entity2).put("key", "value");System.out.println(ensureJsonString(entity1)); // 输出:{"key":"value"}System.out.println(ensureJsonString(entity2)); // 输出:{"key":"value"}}
}

优化点

  1. 尽量避免重复序列化:
    • 优先判断是否是 JSON 字符串,减少不必要的序列化操作。
  2. 使用更高效的存储方式:
    • 如果可能,考虑使用 MySQL 的 JSON 类型字段(需要 MySQL 5.7 或更高版本)。这样可以直接存储 JSON 对象并支持 JSON 查询功能。
  3. 日志记录:
    • 如果 entity 格式异常或解析失败,可以记录日志以方便排查问题。

希望对你有所帮助! 关注我为程序员职业生涯蓄能破局。

相关文章:

java要防止重复序列化的问题JSON.toJSONString转义问题

要防止重复序列化的问题JSON.toJSONString(entity) 20241213 10:29 背景: 我在设计业务实现echart图标渲染,业务接口实时性查询耗时很长,为了提高系统可用性和用户体验,采用中间表的方案——即在中间表中存储大JSON。 但是在自测…...

TS的类型守卫、类型约束实践

类型守卫 // 基础类型判断 const arr [30, 50] console.log(typeof arr) // object const set new Set(arr) console.log(typeof set) // object const map new Map() console.log(typeof map) // objectclass Customer {constructor() {}buy(method:string) {console.log(…...

文件转曲,限制PDF文件编辑的最佳方案!

随着数字化进程的推进,PDF文件凭借其多样化的功能和优越的兼容性已经被广泛使用,成为了现代文档交流和存储的重要工具,满足了不同用户和行业的需求。 虽然PDF格式文件的功能很多,常见的比如阅读、编辑、加密、转换、还可用于印刷…...

MySQL系列之数据授权(安全)

导览 前言Q:如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友,可以Get到一个知识点:数据授权(eg:g…...

用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!

用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码) 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇…...

Vue vs. React:两大前端框架的深度对比与分析(一)

前言 在当今快速发展的前端领域中,Vue和React作为两个备受瞩目的前端框架,已经成为许多开发者的首选。这两个框架凭借其出色的设计和强大的功能,在构建现代化、高效性能的Web应用方面扮演着重要角色。 Vue和React都以其独特的特点吸引了众多开…...

React 进阶深入理解核心概念与高阶实践

在上一节中,我们学习了 React 的基础知识,包括组件、状态管理和基本操作。接下来,我们将进一步探索 React 的高级功能和实战技巧,例如 组件间通信、高阶组件、Context API、React Router 等。这些内容将帮助你构建更复杂、功能更丰…...

Linux shell的七大功能 ---自动补齐、管道机制、别名

1、自动补齐---TAB 输入命令的前几个字符,按下tab键,会自动补齐完整的字符,若有多个命令、文件或目录的前几个字符相同,按下tab将会全部列举出来 2、管道机制---| 例如:ls -- help |more 将有关ls的帮助内容传递给“|…...

XML 在线格式化 - 加菲工具

XML 在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML,点击左上角的“格式化”按钮 得到格式化后的结果...

java_多态的应用

多态数组 应用实例:现有一个继承结构如下:要求创建 1 个 Person 对象、2 个 Student 对象和 2 个 Teacher 对象, 统一放在数组中,并调用每个对象 代码 Person类 package com.hspedu.poly_.polyarr_;import javax.swing.*;/*** author:寰愬悏瓒&#xf…...

Python+OpenCV系列:模版匹配

文章目录 1. 模板匹配基本原理2. cv2.matchTemplate() 函数函数原型: 3. 模板匹配步骤4. 单目标模板匹配示例5. 多目标模板匹配多目标模板匹配示例代码解析: 6. 多模板匹配多模板匹配示例代码解析 7. 总结 模板匹配是一种在图像中寻找模板的位置的方法。…...

【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用

文章目录 一、while 循环1、语法:2、示例: 二、 do-while 循环1、语法:2、示例: 三、for 循环1、语法:2、示例: 四、foreach 循环1、语法:2、示例: 五、总结对比六、注意事项七、使用…...

Spring Boot项目使用虚拟线程

Spring Boot项目启用虚拟线程 开始基本使用先写一个测试方法通过springboot配置项开启虚拟线程 目前存在的问题 开始 虚拟线程正式发布是在JDK21,对于Spring Boot版本选择3以上。 基本使用 关于虚拟线程本身的使用,之前已经介绍过。这里要说的是直接将…...

实现SpringBoot项目嵌入其他项目

很多时候我们需要在项目里面嵌入其他项目或者被其他项目嵌入,如我们开发一个开源项目b,用户需要在自己的项目a嵌入b项目,使用b项目的功能,而且要实现a项目工作最小化,最好实现引入即用。 1.定义b项目的自定义配置 …...

朗致面试---IOS/安卓/Java/架构师

朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试: 第一轮是逻辑行测,25道题目,类似于公务员考试题目,要求90分钟内完成。第二轮是技术面试,主要是做一些数据结…...

数字信号处理:FIR滤波器

FIR(Finite Impulse Response,有限脉冲响应)滤波器是一种数字滤波器,其输出信号是输入信号的加权线性组合。FIR滤波器以其线性相位特性和易于设计的优势,广泛应用于信号处理、通信、音频处理等领域。 FIR滤波器的特点…...

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件,代码如下: // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…...

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…...

Vue 让视图区域滑到指定位置、回到顶部

滑倒指定位置&#xff1a;获取指定的dom&#xff0c;然后用scrollIntoView使dom出现在视图区域 回到顶部&#xff1a;操作父级dom的scrollTop 0&#xff0c;让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...