最近尝试使用JsonGenerator
以流式方式生成JSON。即使你没有将OutputStream
链接到你的直接输出来阅读内容,如果你愿意,你也可以在最后阅读整个内容。
我正试图用Jackson复制完全相同的东西,它是CSV库。
ObjectWriter writer = csvMapper.writer(builder.setUseHeader(true).build());
items.forEachRemaining(item ->
{
// ... prepare item for writing its formatted line to 'writer'
}
);
return ???;
所以基本上我想知道的是,有什么方法可以从CsvMapper
收集整个内容吗?一直潜伏在API中,找不到任何方法来访问任何流或其他内容。
我会使用根节点元素流,并将每个元素映射到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"));
}
}