Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON解析器,它获取字符串的引用并将其解析为JsonObject_Java_Json_String_Immutability - Fatal编程技术网

Java JSON解析器,它获取字符串的引用并将其解析为JsonObject

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将字符串传递给函数时,它是按值传递的,而不是按引用传递的

因此,当我有一个像{a:{b:{c:{d}}}这样的多级JSON对象,并且我有一个路径,我需要从中获取值,比如a:b:c(路径)

假设我有2GB的字符串,现在当我执行jsonObject.get时,我创建2GB的copy by value并将其传递给方法,每次我尝试前进一步时,gc都需要清除所有内存

如果不使用StringBuilder等编写库来接受字符串作为引用,是否有任何方法可以避免这种情况


是否有任何库可以在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);