如何在解析 JSON 字符串时限制内存使用?
How to put a limit on memory usage while parsing a JSON string?
调用
时如何排除java.lang.OutOfMemoryError
new JSONObject(longAndMalformedJSONString)
我正在使用 JSON 解析器的 org.json 实现。
我不是在寻找一种方法来解码错误的 JSON 字符串。我只是想对内存使用量设置一个上限(可能 CPU 使用量)并且可能会得到一个我可以从中恢复的异常。
或者,换句话说,与输入字符串长度相比,解析时的内存使用量永远不会超过一定比例吗?那我就可以限制了。
或者是否有提供此功能的替代图书馆?
读取序列化数据时有两种方法(JSON、XML,随便什么):要么解析整个输入并将对象保存在内存中,要么通过提供的导航流API 并且您只保留您感兴趣的部分。似乎 org.json 没有流式传输 API,但是更复杂的库,例如 Gson do:
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
Message message = gson.fromJson(reader, Message.class);
messages.add(message);
}
reader.endArray();
reader.close();
您也可以对输入进行限制,但这取决于您用于传输 JSON 有效载荷的协议
调用
时如何排除java.lang.OutOfMemoryError
new JSONObject(longAndMalformedJSONString)
我正在使用 JSON 解析器的 org.json 实现。
我不是在寻找一种方法来解码错误的 JSON 字符串。我只是想对内存使用量设置一个上限(可能 CPU 使用量)并且可能会得到一个我可以从中恢复的异常。
或者,换句话说,与输入字符串长度相比,解析时的内存使用量永远不会超过一定比例吗?那我就可以限制了。
或者是否有提供此功能的替代图书馆?
读取序列化数据时有两种方法(JSON、XML,随便什么):要么解析整个输入并将对象保存在内存中,要么通过提供的导航流API 并且您只保留您感兴趣的部分。似乎 org.json 没有流式传输 API,但是更复杂的库,例如 Gson do:
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
Message message = gson.fromJson(reader, Message.class);
messages.add(message);
}
reader.endArray();
reader.close();
您也可以对输入进行限制,但这取决于您用于传输 JSON 有效载荷的协议