簡體   English   中英

讀取JSON到對象:java.lang.OutOfMemoryError:Java堆空間

[英]Reading JSON to object: java.lang.OutOfMemoryError: Java heap space

我有一個像這樣的JSON:

{
field1: "asd",
theBigField: "bigggg300mb",
field2: "tyu"
}

我在方法輸入參數上擁有的是InputStream。 我無法在JVM上增加內存,以便它可以接受該消息。 我也不能return new ObjectMapper().readValue(bytes, MyModel.class)因為我沒有太多內存可以從此消息創建對象。 我想做的是從消息中提取field1和field2並根據某些規則對其進行驗證。

我在方法的開始處有InputStream。從中得到字節數組。如何提取field1field2

我正在使用Java8,可以使用流行的開源和輕量級庫。 也許可以通過編程以其他方式完成?

我要避免的是不要將整個消息讀入內存,因此應該采用某種迭代方法。

我的第一次嘗試是使用@JsonIgnore注釋MyClass::theBigField @JsonIgnore (如果使用Jackson / ObjectMapper)。 不過,不確定是否可以使用。

作為最后的選擇,如果輸入結構是固定的並且您事先知道,則可以嘗試手動解析流。 像這樣:

    private static void parseMyJson(InputStream stream) throws IOException {
          StringBuffer[] fields = new StringBuffer[] { new StringBuffer(), null, new StringBuffer() };
          int fieldNum = 0;
          boolean readingFieldValue = false;
          int read = 0;
          while ((read = stream.read()) != -1) {
            char readChar = (char) read;
            if (readChar == '"') {
               fieldNum += readingFieldValue ? 0 : 1;
               readingFieldValue = !readingFieldValue;
            } else if (readingFieldValue && fieldNum != 2) {
               fields[fieldNum-1].append(readChar);
            }
          }
          System.out.println(fields[0].toString());
          System.out.println(fields[2].toString());
    }

上面的代碼是一個非常原始且效率低下的解析器(您可能需要一些更高級的解析器),但要點是,您僅在內存中分配了一部分讀取字符,如果它們與您感興趣的字段不對應,則將其丟棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM