0

0

如何将包含嵌套 JSON 字符串的 CSV 正确解析为结构化 JSON

碧海醫心

碧海醫心

发布时间:2025-12-29 15:38:21

|

240人浏览过

|

来源于php中文网

原创

如何将包含嵌套 JSON 字符串的 CSV 正确解析为结构化 JSON

本文介绍一种绕过 csv 格式缺陷的实用方案:当 csv 中某列值本身是未加引号的 json 字符串(如 {"name":"john","age":30})时,通过预处理替换边界符号并自定义引号字符,使 jackson 能安全解析嵌套 json 为字符串字段,最终输出符合预期的 json 结构。

CSV 规范明确要求:若字段值包含分隔符(如逗号)、换行符或双引号,必须用引号(默认为 ")包裹。但现实中,部分系统导出的 CSV 会直接将 JSON 字符串作为纯文本写入某列,且未加引号——这会导致标准 CSV 解析器误判字段边界,造成解析失败或数据错位。

例如以下非法 CSV:

header1,header2,header3
value1,value2,{"name":"John","age":30,"car":null}

第三列的 JSON 含逗号,却无引号包裹,CsvMapper 默认会将其截断为 {"name":"John" 和 "age":30,"car":null} 两列,破坏结构。

笔灵AI论文写作
笔灵AI论文写作

免费生成毕业论文、课题论文、千字大纲,几万字专业初稿!

下载

✅ 解决思路:临时“伪引号”预处理

由于无法修改上游生成逻辑,我们采用轻量级文本预处理 + 自定义引号字符的方式:

  • 将每个 JSON 字段的最外层 { 替换为 |{,} 替换为 }|(注意:仅处理首尾大括号,避免影响 JSON 内部嵌套结构);
  • 配置 CsvSchema 使用 | 作为 quote character;
  • Jackson 即可将 |{...}| 识别为一个完整带引号的字段,并原样保留为字符串(而非尝试解析 JSON)。
⚠️ 注意:该方法适用于 JSON 字段不嵌套在更复杂结构中(如 CSV 行内含多个 JSON 列),且 JSON 本身不含 | 字符的场景。若存在 |,需改用更安全的分隔符(如 \u0001)或正则精准匹配首尾大括号。

示例代码(Jackson 2.15+)

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

import java.io.File;
import java.nio.file.Files;
import java.util.stream.Collectors;

public class CsvToJsonConverter {
    public static void main(String[] args) throws Exception {
        File csvFile = new File("./resource/test.csv").getAbsoluteFile();
        String csv = Files.readAllLines(csvFile.toPath())
                .stream()
                .collect(Collectors.joining(System.lineSeparator()));

        // ✅ 关键预处理:仅包裹最外层 JSON 的 {},避免破坏内部结构
        csv = csv.replaceFirst("(?<=,|^)\\{", "|{")
                  .replaceAll("}\\s*(?=,|$)", "}|");

        CsvMapper csvMapper = CsvMapper.builder().build();
        CsvSchema schema = CsvSchema.builder()
                .setQuoteChar('|')
                .setUseHeader(true)
                .build();

        JsonNode jsonNode = csvMapper.readerFor(JsonNode.class)
                .with(schema)
                .readValue(csv);

        // 输出格式化 JSON(含缩进)
        JsonMapper jsonMapper = JsonMapper.builder()
                .enable(JsonMapper.Feature.INDENT_OUTPUT)
                .build();
        jsonMapper.writeValue(System.out, jsonNode);
    }
}

输出结果

{
  "header1" : "value1",
  "header2" : "value2",
  "header3" : "{\"name\":\"John\",\"age\":30,\"car\":null}"
}

可见 header3 的值被正确保留为转义后的 JSON 字符串,完全符合需求。

总结

  • 根本原因:非法 CSV 格式导致解析歧义;
  • 核心技巧:用可控符号(|)临时“标记”JSON 边界,借力 CSV 引号机制实现字段隔离;
  • 适用边界:适合单层 JSON 字段、无冲突字符的场景;生产环境建议推动上游修复 CSV 导出逻辑(添加标准双引号包裹);
  • 扩展建议:对复杂场景,可结合 JsonParser 手动流式解析,或使用 OpenCSV + 自定义 CellProcessor 做更精细控制。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

401

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

306

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

72

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

227

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

432

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.04

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

C# 教程
C# 教程

共94课时 | 5.5万人学习

Java 教程
Java 教程

共578课时 | 38.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号