如何将含嵌套JSON对象的CSV转换为指定格式JSON(基于Jackson)
如何用Jackson将含内嵌JSON的CSV转换为指定格式的JSON
需求场景
现有如下CSV内容:
header1,header2,header3 value1,value2,{"name":"John","age":30,"car":null}
需要将其转换为以下格式的JSON,要求第三列的内嵌JSON以转义后的字符串形式保留,而非解析为JSON对象:
{ "header1": "value1", "header2": "value2", "header3": "{\"name\":\"John\",\"age\":30,\"car\":null}" }
解决方案(基于Jackson CSV模块)
针对你当前的代码配置,需要调整两处核心设置,解决解析时分隔符冲突和结果格式问题:
1. 修正CsvSchema配置
为包含内嵌JSON的列指定LITERAL类型,确保解析器将该列的完整内容(包括内部逗号)作为单个字符串读取,避免被错误拆分:
CsvSchema schema = CsvSchema.builder() .setUseHeader(true) .addColumn("header1") .addColumn("header2") // 标记第三列为LITERAL类型,完整读取内嵌JSON内容 .addColumn("header3", CsvSchema.ColumnType.LITERAL) .build();
2. 调整CsvMapper配置
关闭WRAP_AS_ARRAY特性(你当前开启了该特性,会导致输出数组而非键值对对象),保留IGNORE_TRAILING_UNMAPPABLE以兼容多余列的情况:
CsvMapper mapper = CsvMapper.builder() .enable(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE) // 关闭WRAP_AS_ARRAY,生成以表头为键的JSON对象 .disable(CsvParser.Feature.WRAP_AS_ARRAY) .build();
3. 完整转换示例代码
public class CsvToJsonExample { public static void main(String[] args) throws IOException { String csvContent = """ header1,header2,header3 value1,value2,{"name":"John","age":30,"car":null} """; // 构建Schema和Mapper CsvSchema schema = CsvSchema.builder() .setUseHeader(true) .addColumn("header1") .addColumn("header2") .addColumn("header3", CsvSchema.ColumnType.LITERAL) .build(); CsvMapper mapper = CsvMapper.builder() .enable(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE) .disable(CsvParser.Feature.WRAP_AS_ARRAY) .build(); // 执行转换并输出格式化结果 JsonNode resultNode = mapper.readerFor(JsonNode.class) .with(schema) .readValue(csvContent); String formattedJson = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(resultNode); System.out.println(formattedJson); } }
关键说明
- LITERAL列类型:解决CSV内嵌JSON中的逗号被误判为列分隔符的问题,确保整段JSON被作为单个字符串读取。
- 关闭WRAP_AS_ARRAY:默认开启该特性会将每行CSV转为JSON数组,关闭后Jackson会根据表头生成键值对形式的JSON对象,匹配你的需求。
- 转义处理:Jackson会自动将字符串中的双引号转义,最终输出符合要求的JSON格式。
内容的提问来源于stack exchange,提问作者Vaibhav Tiwari
相关产品推荐
相关产品推荐

