有没有办法使用Jackson的ObjectMapper来序列化流?

时间:2018-04-03 13:31:25

标签: java json stream jackson objectmapper

有没有办法使用Jackson的ObjectMapper序列化java.util.stream.Stream<T>

我没有提到Jackson的流媒体API,它允许您以块的形式处理JSON文档。 我也没有提到像java.io.InputStream那样使用Java的I / O流来读取JSON文件。

我指的是JDK8引入的Java流媒体API。

我想做这样的事情:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.stream.Stream;

public final class JsonSerializer {

    private final ObjectMapper objectMapper;

    public JsonSerializer(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    public String serializeAsString(SimpleObjectBean bean) throws JsonProcessingException {
        return objectMapper.writerFor(SimpleObjectBean.class).writeValueAsString(bean);
    }

    public String serializeListAsString(List<SimpleObjectBean> beans) throws JsonProcessingException {
        return objectMapper.writerFor(List.class).writeValueAsString(beans);
    }

    // does not work
    public String serializeStreamAsString(Stream<SimpleObjectBean> beanStream) throws JsonProcessingException {
        return objectMapper.writerFor(Stream.class).writeValueAsString(beanStream);
    }

    // used as workaround. "converting" stream into iterator beforehand
    public String serializeIteratorAsString(Iterator<SimpleObjectBean> beanIterator) throws JsonProcessingException {
        return objectMapper.writerFor(Iterator.class).writeValueAsString(beanIterator);
    }

}

我使用Jackson 2.9.5

1 个答案:

答案 0 :(得分:1)

序列化Streams并不是一个好主意,因为Streams不是持久性的。而且它们只能遍历一次。在这种情况下,收藏将是更好的选择。 但是可以这样做:

new ObjectMapper().writerWithType(Iterator.class).writeValueAsString(stream.iterator());