将带有嵌套JSON对象的CSV转换为JSON

6l7fqoea  于 2023-01-14  发布在  其他
关注(0)|答案(3)|浏览(120)

我有一个示例CSV消息:

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

如何将其转换为嵌入式JSON的形式,如下所示:

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

我正在使用Jackson架构生成器和默认列分隔符:

CsvSchema.builder().disableQuoteChar().setUseHeader(true).build();
CsvMapper.builder().enable(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE, CsvParser.Feature.WRAP_AS_ARRAY).build();
cgyqldqp

cgyqldqp1#

显示的CSV内容已损坏。包含列分隔符的值应使用引号字符括起来。如果我们无法更改生成它的应用程序,则需要在反序列化过程之前对其进行修改。此示例很简单,因此我们只需将{替换为|{,将}替换为}|,并将|设置为引号字符。但是对于带有内部对象的JSON有效载荷,我们只需要替换第一个{和最后一个}括号。代码如下所示:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializationFeature;
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 CsvApp {

    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()));
        csv = csv.replace("{", "|{").replace("}", "}|");

        CsvMapper csvMapper = CsvMapper.builder().build();

        CsvSchema csvSchema = CsvSchema.builder().setQuoteChar('|').setUseHeader(true).build();
        Object csvContent = csvMapper.readerFor(JsonNode.class).with(csvSchema).readValue(csv);

        JsonMapper mapper = JsonMapper.builder().enable(SerializationFeature.INDENT_OUTPUT).build();
        mapper.writeValue(System.out, csvContent);
    }
}

以上代码打印:

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

izkcnapc2#

您可以使用csv JS库,如json-2-csv

# Global so it can be called from anywhere
npm install -g json2csv

# or as a dependency of a project
npm install json2csv --save
uklbhaso

uklbhaso3#

您可以按如下方式org.json.CDL

BufferedReader br = new BufferedReader(new FileReader("file.csv"));
        String csvAsString = br.lines().collect(Collectors.joining("\n"));
        String json = CDL.toJSONArray(csvAsString).toString();
        try {
            Files.write(Path.of("src/main/resources/output.json"), json.getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {
            e.printStackTrace();
        }

相关问题