有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJSON序列化流

有没有办法让Jackson序列化某个流对象(然后关闭)?像这样:

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

更新

澄清:我想要流式传输内容,而不仅仅是将其序列化为单个字符串对象


共 (2) 个答案

  1. # 1 楼答案

    您的问题类似于: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..."
    }
    
  2. # 2 楼答案

    实现一个自定义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;
    }