JSON Parser,它接受字符串的引用并将其解析为JsonObject

时间:2016-03-15 13:23:03

标签: java json string immutability

当java将字符串传递给函数时,它会按值传递而不是通过引用传递,以供参考点击here

getKeyValue(String o); // This creates a new string and passed by value


Class A
{
String o;
}

A a; 

getKeyValue(A a); // This passes reference of object a, String o is not duplicated. 

所以,当我有一个多级JSON对象,如{a:{b:{c:“d”}}},我有一个路径,我需要从中获取值,如:a:b:c(路径)

for(String s: path.split(':')
{
   jsonObject = jsonObject.get(s)
}
println jsonObject

假设我有2 GB字符串,现在当我执行jsonObject.get(s)时,我按值创建2 GB副本并将其传递给方法,并且gc需要在每次尝试一步时清除所有内存先。

有没有办法避免这种情况,如果没有编写一个库来接受字符串作为参考使用StringBuilder等..。

是否有任何库可以解决java中的这个问题。

1 个答案:

答案 0 :(得分:0)

如果你必须处理2GB字符串,可能更好的方法是使用InputStream来提供json解析器。假设您正在使用Jackson并且您正在阅读的json来自文件(例如a.json),您可以执行以下操作:

ObjectMapper objectMapper = new ObjectMapper();
InputStream input = new FileInputStream("data/a.json");
A myA = objectMapper.readValue(input, A.class);

这种方法可以(并且我重复:可能)比在解析它之前将整个字符串读入内存更有效。 关于'按值传递'字符串重复:如果将字符串传递给方法(只是对字符串的引用是重复的),则不会复制任何字符串,因此没有内存问题。