2013-02-26 30 views
4

如何使用jackson流API json?看到我的代码如下:使用超大的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。我究竟做错了什么?

+0

[下面是一个例子](http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/) – 2013-02-26 19:58:54

+0

@SotiriosDelimanolis非常好,非常感谢。解决内存不足的问题。现在,如何显示生成json? – 2013-02-26 20:10:21

+0

您可以通过一些InputStream读取文件,将其放入String中并打印出来。 – 2013-02-26 20:12:50

回答

1

不是将所有图像保存在内存中,而是逐渐读写它们。 Jackson Streaming API的示例可以在here(“阅读和编写事件流”)中找到。

编辑:这应该不会太难搞清楚人......但这里有一个骨骼例如:

// 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();

这应该是关键。

+0

同样的问题。由于文件很大,无法使用base64来生成json。没门。如何从数据库中为每个图像生成一个url?任何想法? – 2013-02-27 13:52:21

+0

同样是什么?当你逐渐读写事物时,它们不会被存储在内存中 - 显然你会写入文件或其他流式存储。而不是在内存中编码Base64,只要可以使用'InputStream'访问二进制数据,也可以逐步编写。至于URL,这是JSON数据绑定的另一个问题和外部范围。但是,真的,而不是提出问题,你应该试着理解我指出的例子,并且看到_why_它有所作为。 – StaxMan 2013-02-27 17:58:01

+0

谢谢,我可以生成images.json,没问题,但是读取images.json是不可能的,巨大的文件。无法为资源有限的移动应用程序。现在,为每个图像生成一个URL,解决我的问题。 – 2013-02-27 21:35:21