gpt4 book ai didi

java - 读取 JSON 到对象 : java. lang.OutOfMemoryError: Java 堆空间

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:01 25 4
gpt4 key购买 nike

我有一个像这样的 JSON:

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

我的方法输入参数是InputStream。我无法增加 JVM 上的内存以便它接受消息。我也无法执行 return new ObjectMapper().readValue(bytes, MyModel.class) ,因为我没有太多内存来从此消息创建对象。我想做的是从消息中提取 field1 和 field2 并根据某些规则验证它们。

我在方法启动上有InputStream..从中我得到了字节数组..我如何提取field1field2

我正在使用Java8,我可以使用流行的开源和轻型库。也许可以通过其他方式(以编程方式)完成?

我想避免的是不要将整个消息读入内存,所以它应该是某种迭代方法。

最佳答案

我的第一次尝试是用 @JsonIgnore 注释 MyClass::theBigField (如果您使用 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());
}

上面的代码是一个非常原始且低效的解析器(您可能需要更高级的东西),但要点是您只在内存中分配一 block 读取的字符,然后在它们与您感兴趣的字段不对应时丢弃它们。

关于java - 读取 JSON 到对象 : java. lang.OutOfMemoryError: Java 堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54750522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com