0

最近一直在尝试使用JsonGenerator. 即使您没有将 链接OutputStream到直接输出以阅读内容,如果您愿意,您也可以在最后阅读整个内容。

我试图用杰克逊复制完全相同的东西,它是 CSV 库。

ObjectWriter writer = csvMapper.writer(builder.setUseHeader(true).build());
    items.forEachRemaining(item ->
        {
            // ... prepare item for writing its formatted line to 'writer'
        }
    );

return ???;

所以基本上我想知道的是,有没有办法收集整个内容CsvMapper?一直潜伏在 API 中,找不到任何方法来访问任何流或其他任何东西。

4

1 回答 1

0

我会使用根节点元素流并将每个元素映射到 csv 格式的字符串。如下所示:

package example;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.google.common.collect.Streams;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;


public class CsvMapperTest {
    @Test
    public void csvMapper() throws Exception{
        String [][] names = {
                {"1", "John", "Lennon"},
                {"2", "Bob", "Marley"}
        };
        JsonNode jsonNode = new ObjectMapper().valueToTree(names);

        CsvSchema s = CsvSchema.builder()
                .addColumn("id", CsvSchema.ColumnType.NUMBER_OR_STRING)
                .addColumn("name", CsvSchema.ColumnType.STRING)
                .addColumn("lastname", CsvSchema.ColumnType.STRING)
                .build();
        ObjectWriter csvWriter = new CsvMapper().writer(s);
        Stream<String> csvStream = Streams.stream(jsonNode.elements()).map(el -> {
                    try {
                        return csvWriter.writeValueAsString(el);
                    } catch (Exception ex) {
                        return null;
                    }
                }
        );

        List<String> lines =csvStream.collect(Collectors.toList());
        assertThat(lines, hasSize(2));
        String line0 = lines.get(0).trim();
        assertThat(lines.get(0).trim(), equalTo("1,John,Lennon"));
    }
}

于 2020-02-28T11:38:07.873 回答