春季启动时将CSV格式的JSON转换为JSON

时间:2020-02-03 04:37:45

标签: json spring-boot csv

我需要解析一个CSV文件,其中包含1个头记录(无名称),一对多的详细记录和一个尾部记录,如下所示(input.csv),需要将其转换为output.json格式。

我使用下面的opencsv库将记录读入字符串数组列表,其中列表中的每个字符串数组代表1条记录。

opencsv中还提供了一个bean映射,但是它不具有将标头记录映射到单独的Bean,将详细信息记录映射到单独的bean阵列以及将尾部记录映射到另一个单独的bean的功能。

http://opencsv.sourceforge.net/#reading_without_annotations_column_positions

因此,我现在很想从CSV中生成带有标题,多个详细信息和一个尾部记录的Json。

有人可以分享一些想法来实现这一目标吗?

input.csv

1,,,

2,DC PIV REL11,D6,

2,DC PIV REL12,ADDED VIA SFTP12,

2,D6,ADDED VIA SFTP6,

3,123,END

output.json

{
    "header": {
    "type": "1",
    "number": "",
    "code": ""
},
{
  "contents": {
    "content": [
      {
        "type": "2",
        "name": "DC PIV REL11",
        "reference": "D6"
      },
      {
        "type": "2",
        "name": "DC PIV REL12",
        "reference": "ADDED VIA SFTP12"
      },
      {
        "type": "2",
        "name": "D6",
        "reference": "ADDED VIA SFTP6"
      }
    ]
},
{ 
"tail": {
    "type": "3",
    "number": "123",
    "code": "END"
 }
}

1 个答案:

答案 0 :(得分:1)

我找到了以下解决方案。

我用适当的getter设置器创建了4个DTO类Root,Header,Contents和Tail,并使用下面的代码解决了这个问题。

请注意,我没有在下面的代码中添加验证逻辑来​​检查记录是标题,内容还是结尾记录,因为我假设第一个记录是标题结尾,但是一个记录是内容,最后一条记录是结尾。

希望这会有所帮助。

CSVReader reader = new CSVReader(new FileReader(classLoader.getResource("sample_file.txt").getFile()));


    List<String[]> records = reader.readAll();

    int count = 0;
    Header header = new Header();
    Contents contents = new Contents();
    Tail tail = new Tail();
    List<Content> contentList = new ArrayList<Content>();
    for (String[] record : records) {

        if (count == 0 ) {

            header.setRecordType(record[0]);
            header.setNumber(record[1]);
            header.setCode(record[2]);              
        } else if (count < (records.size() - 1)) {

            Content content = new Content();
            content.setRecordType(record[0]);
            content.setName(record[1]);
            content.setReference(record[2]);

            contentList.add(content);
        } else {

            tail.setRecordType(record[0]);
            tail.setNumber(record[1]);
            tail.setCode(record[2]);

        }
        count++;

    }
    contents.setContent(contentList);

    Root root = new Root();
    root.setHeader(header);
    root.setContents(contents);
    root.setTail(tail);