4

如何将流 API json 与杰克逊一起使用?请参阅下面的代码:

    ObjectMapper mapper = new ObjectMapper();

    Map<String, Object> map = new HashMap<String, Object>();

    List<Object> list = new ArrayList<Object>();

    // Get images in database
    try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USER, PASSWORD);

            Statement s = connection.createStatement();
            ResultSet r = s.executeQuery("select * from images");

            while (r.next()) {

                byte[] imageBytes = r.getBytes("image");
                String imageBase64 = DatatypeConverter.printBase64Binary(imageBytes);
                list.add(imageBase64);
            }

    } catch (SQLException e) {

    }

    map.put("images", list);

    // Stream Json API
    try {
            mapper.writeValue(new File("c:\\images.json"), map);
    } catch (JsonGenerationException e) {
            e.printStackTrace();
    } catch (JsonMappingException e) {
            e.printStackTrace();
    } catch (IOException e) {
            e.printStackTrace();
    }

总是从内存中返回。我不知道将流与杰克逊一起使用。我使用超大 json,平均 2000 张图像,每个图像都有一个 imageBase64。我究竟做错了什么?

4

1 回答 1

1

无需将所有图像保存在内存中,只需增量读取和写入它们。可以在此处找到 Jackson Streaming API 的示例(“Reading and Writing Event Streams”)。

编辑:这应该很难弄清楚人们......但这是一个骨架示例:

// typed from memory, some methods may be off a bit
JsonFactory f = objectMapper.getFactory();
JsonGenerator gen = f.createGenerator(new File("c:\\images.json"));
gen.writeStartArray(); // to get array of objects
// get the DB connection etc
while (r.next()) {
  gen.writeFieldName("image");
  InputStream in = r.getBinaryStream("image");
  gen.writeBinary(in, -1); // length optional for JSON
  in.close();
}

    gen.writeEndArray(); // 获取对象数组 gen.close();

这应该可以解决问题。

于 2013-02-27T05:34:49.187 回答