杰克逊JSON - 序列化流

时间:2015-07-15 19:11:45

标签: java json jackson

有没有办法让杰克逊序列化一些流对象(并在之后关闭)?像这样:

class TextFile{
    String fileName;
    StringReader content;
    //ByteArrayInputStream content;
}

更新

澄清:我想要流式传输内容,而不只是将其序列化为单个String对象。

2 个答案:

答案 0 :(得分:1)

实施自定义JsonSerializer

public class StreamSerializer extends JsonSerializer<ByteArrayInputStream> {

    @Override
    public void serialize(ByteArrayInputStream content, 
                          JsonGenerator jsonGenerator, 
                          SerializerProvider serializerProvider) 
                          throws IOException, JsonProcessingException {
        jsonGenerator.writeBinary(content, -1);
}

并像这样使用它:

public class TextFile {
    String fileName;
    @JsonSerialize(using=StreamSerializer.class, as=byte[].class)
    ByteArrayInputStream content;
}

答案 1 :(得分:0)

您的问题类似于:Jackson JSON custom serialization for certain fields

期望的行为是什么?您是否希望将流序列化为字符串,二进制内容,解析和序列化为对象等。

假设您希望将数据序列化为字符串,您可以使用注释告诉Jackson如何序列化它:

public class TextFile {
    String fileName;
    @JsonSerialize(using=ReaderToStringSerializer.class, as=String.class)
    StringReader content;
}


public class ReaderToStringSerializer extends JsonSerializer<Reader> {

@Override
public void serialize(Reader contents, 
                      JsonGenerator jsonGenerator, 
                      SerializerProvider serializerProvider) 
                      throws IOException, JsonProcessingException {
    StringBuilder buffer = new StringBuilder();
    char[] array = new char[8096];
    int len = 0;
    while (-1 != (len = contents.read(array))) {
        buffer.append(array,0,len);
    }
    contents.close();
    jsonGenerator.writeString(buffer.toString());
}

输出类似于:

{
  "fileName": "foo.bar",
  "content": "the quick brown fox..."
}