Java后端处理前端字符串与 JSON 数据:安全拼接与转义技巧

在现代 Web 开发中,前后端数据交互是家常便饭。我们经常需要处理前端传递的字符串和 JSON 数据,并在后端进行加工处理后发送到其他服务。本文将以 Spring Boot 为例,探讨如何安全地拼接字符串和 JSON 数据,并介绍如何避免 JSON 特殊字符导致的潜在问题。

场景重现:前端数据,后端加工

假设我们正在开发一个电商平台,前端需要将用户评论(字符串)和商品信息(JSON 数组)发送到后端。后端需要将用户评论进行简单处理(例如添加时间戳),然后将其与商品信息合并成新的 JSON 数据,并发送到推荐服务进行分析。

前端代码(示例):

复制代码
const comment = "这款产品真不错!";
const productInfo = [
  {"id": 1, "name": "商品A"},
  {"id": 2, "name": "商品B"}
];

// ... 使用 Fetch API 发送 POST 请求到后端 ...

后端代码(Spring Boot):

复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
// ... 其他 imports

@RestController
public class DataController {

    @PostMapping("/api/processData")
    public String processData(@RequestBody RequestData data) {
        String comment = data.getComment();
        List<Map<String, Object>> productInfo = data.getProductInfo();

        // 对评论进行处理
        String processedComment = "【" + LocalDateTime.now() + "】 " + comment;

        // 将处理后的评论添加到 JSON 数组
        Map<String, Object> newEntry = new HashMap<>();
        newEntry.put("comment", processedComment);
        productInfo.add(newEntry);

        // ... 使用 RestTemplate 发送 POST 请求到推荐服务 ...
    }
}

// ... RequestData 类定义 ...

潜藏危机:JSON 特殊字符

上述代码看似简单,但却隐藏着一个潜在的风险:如果用户评论中包含 JSON 特殊字符(例如双引号、反斜杠等),就会导致生成的 JSON 数据格式错误,从而引发解析异常。

例如,如果用户评论为 "这款产品 "真不错!", 生成的 JSON 数据就会变成:

复制代码
[
  {"id": 1, "name": "商品A"},
  {"id": 2, "name": "商品B"},
  {"comment": "【2023-10-26T16:05:30.220】 "这款产品 "真不错!""}
]

可以看到,由于评论中的双引号未经转义,导致生成的 JSON 格式错误,无法被正确解析。

解决方案:手动转义特殊字符

为了解决这个问题,我们需要对用户评论中的特殊字符进行转义。最简单的方法是手动替换:

复制代码
// ...
String processedComment = "【" + LocalDateTime.now() + "】 " + escapeJson(comment);
// ...

// 手动转义 JSON 特殊字符
private String escapeJson(String str) {
    if (str == null) {
        return null;
    }
    return str.replace("\\", "\\\\")
            .replace("\"", "\\\"")
            .replace("\b", "\\b")
            .replace("\f", "\\f")
            .replace("\n", "\\n")
            .replace("\r", "\\r")
            .replace("\t", "\\t");
}

更优解:借助 Jackson 库

手动转义虽然可行,但代码显得冗长。我们可以借助 Spring Boot 默认集成的 Jackson 库来更优雅地解决问题:

复制代码
// ...
ObjectMapper objectMapper = new ObjectMapper();
newEntry.put("comment", objectMapper.writeValueAsString(processedComment)); 
// ...

objectMapper.writeValueAsString() 方法会将 Java 对象序列化为 JSON 字符串,并自动处理特殊字符转义。

另外一种使用 Apache Commons Text 库中的 StringEscapeUtils 类:

复制代码
import org.apache.commons.text.StringEscapeUtils;
// ...
String escapedString = StringEscapeUtils.escapeJson(modifiedString);
Map<String, Object> newEntry = new HashMap<>();
newEntry.put(\"string\", escapedString);
jsonData.add(newEntry);
// ...
  • 优点:专门用于字符串转义,效率较高。
  • 缺点:需要添加额外的依赖。

总结

在 Spring Boot 中处理前端传递的字符串和 JSON 数据时,需要注意潜在的 JSON 特殊字符问题。我们可以通过手动转义或借助 Jackson 库来安全地拼接字符串和 JSON 数据,确保数据完整性和程序稳定性。

希望本文能够帮助您更好地理解 Spring Boot 中字符串与 JSON 数据处理的相关技巧,并在实际项目中得心应手。

相关推荐
能摆一天是一天16 分钟前
JAVA stream().flatMap()
java·windows
颜如玉1 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂2 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年2 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152873 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草3 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6923 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea4 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha4 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统
minh_coo4 小时前
Spring框架事件驱动架构核心注解之@EventListener
java·后端·spring·架构·intellij-idea