Java JSON解析器,它获取字符串的引用并将其解析为JsonObject
当java将字符串传递给函数时,它是按值传递的,而不是按引用传递的 因此,当我有一个像{a:{b:{c:{d}}}这样的多级JSON对象,并且我有一个路径,我需要从中获取值,比如a:b:c(路径) 假设我有2GB的字符串,现在当我执行jsonObject.get时,我创建2GB的copy by value并将其传递给方法,每次我尝试前进一步时,gc都需要清除所有内存 如果不使用StringBuilder等编写库来接受字符串作为引用,是否有任何方法可以避免这种情况Java JSON解析器,它获取字符串的引用并将其解析为JsonObject,java,json,string,immutability,Java,Json,String,Immutability,当java将字符串传递给函数时,它是按值传递的,而不是按引用传递的 因此,当我有一个像{a:{b:{c:{d}}}这样的多级JSON对象,并且我有一个路径,我需要从中获取值,比如a:b:c(路径) 假设我有2GB的字符串,现在当我执行jsonObject.get时,我创建2GB的copy by value并将其传递给方法,每次我尝试前进一步时,gc都需要清除所有内存 如果不使用StringBuilder等编写库来接受字符串作为引用,是否有任何方法可以避免这种情况 是否有任何库可以在java中解决
是否有任何库可以在java中解决此问题。如果必须处理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);
这种方法可能(我重复一下:可能)比在解析之前将整个字符串读入内存更高效。
关于“按值传递”字符串复制:如果将字符串传递给方法,则不会复制任何字符串(仅复制对字符串的引用),因此不会出现内存问题。Java中的所有内容都使用按值传递。。。老实说,我不太清楚你在问什么。关于
getKeyValue
方法和Class A
的问题的前半部分特别不清楚:(当你用Java传递一个字符串时,它不会被复制。只有当你试图修改它时它才会被复制,因为Java字符串是不可变的,要修改它们,你会创建一个新的实例。@jonsket True。但是当传递了一个字符串时“引用是作为值复制的”,而不是整个对象。检查此@matanso否当传递字符串时,它是重复的(按值传递)检查此链接。虽然当函数返回GC时,应该清除所有内存,但我试图避免此getKeyValue(字符串o)
将通过值传递对o
的引用。这意味着复制的不是字符串本身,而是其引用(即类似于内存地址的内容)。
for(String s: path.split(':')
{
jsonObject = jsonObject.get(s)
}
println jsonObject
ObjectMapper objectMapper = new ObjectMapper();
InputStream input = new FileInputStream("data/a.json");
A myA = objectMapper.readValue(input, A.class);