Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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解析到HashMap<;ArrayList<&燃气轮机&燃气轮机;在Libgdx中抛出堆栈溢出错误?_Java_Json_Parsing_Libgdx_Stack Overflow - Fatal编程技术网

Java Json解析到HashMap<;ArrayList<&燃气轮机&燃气轮机;在Libgdx中抛出堆栈溢出错误?

Java Json解析到HashMap<;ArrayList<&燃气轮机&燃气轮机;在Libgdx中抛出堆栈溢出错误?,java,json,parsing,libgdx,stack-overflow,Java,Json,Parsing,Libgdx,Stack Overflow,我的Json是: { "objects":{ "apple":[ {"x":3, "y":5}, {"x":6, "y":9} ], "car":[ {"x":7, "y":9}, {"x":5, "y":8} ] } } import com.badlogic.gdx.utils.Json; 导入java.util

我的Json是:

{
    "objects":{
        "apple":[
            {"x":3, "y":5},
            {"x":6, "y":9}
        ],
        "car":[
            {"x":7, "y":9},
            {"x":5, "y":8}
        ]
     }
 }
import com.badlogic.gdx.utils.Json;
导入java.util.ArrayList;
导入java.util.HashMap;
甲级公共课{
公共整数x,y;
}
公共B类{
公共HashMap对象;
}
公共静态void main(字符串[]args){
Json=newJSON();
ClassB ClassB=json.fromJson(ClassB.class,“{\n”+
“\”对象\“:{\n”+
“\'apple\”:[\n”+
{\'x\':3,\'y\':5}\n+
{\'x\':6,\'y\':9}\n+
“],\n”+
“\'car\”:[\n”+
{\'x\':7,\'y\':9}\n+
{\'x\':5,\'y\':8}\n+
“]\n”+
“}\n”+
"        }");
System.out.println(json.toJson(classB));
}
我使用“Libgdx”,“json.fromJson”可以正常工作,当我调用“json.toJson(classB)”时,会抛出一个异常:

线程“main”java.lang.StackOverflower中出现异常 位于com.badlogic.gdx.utils.JsonWriter$OutputType.quoteValue(JsonWriter.java:187) 位于com.badlogic.gdx.utils.JsonWriter.value(JsonWriter.java:88) 位于com.badlogic.gdx.utils.Json.writeValue(Json.java:574) 位于com.badlogic.gdx.utils.Json.writeFields(Json.java:290) 位于com.badlogic.gdx.utils.Json.writeValue(Json.java:580) 位于com.badlogic.gdx.utils.Json.writeFields(Json.java:290) 位于com.badlogic.gdx.utils.Json.writeValue(Json.java:580) ... 当我在ClassB中将HashMap中的“ArrayList”更改为字符串(etc)时,代码运行良好


那么,当我使用“ArrayList”时为什么会出现异常,以及如何将我的json解析为ClassB实例呢?

正如注释中所要求的那样

将libGDX错误作为新问题发布

将其添加到build.gradle依赖项(如果使用默认结构,则添加到核心项目):

初始化Gson对象:

Gson gson = new Gson();
并使用from和to json函数:

String json = gson.toJson(classB);


是的,StackOverflowException本身就是一个bug

libGDX的JSON类在某些地方需要类类型信息,如果它不能自己推断类型的话。在这方面,它比其他更大的库(如Gson)宽容得多

见:

在您的示例中,最简单的修复方法是将ClassA实例编写为:

"    {\"class\": \"net.your.package.ClassA\", \"x\":3, \"y\":5},\n"
类名可以缩短,请参见Json.setElementType()

一般来说,作为一种最佳实践,对于原型设计,我建议使用与您的方法相反的方法。在代码中创建结构,然后写入JSON以查看libGDX如何“感知”您的数据结构,然后从JSON读回以验证输出


旁注:在大多数情况下,建议您在示例中使用libGDX容器、
ObjectMap
Array
。此外,ClassA成员可能是
int
而不是
Integer
,以避免自动装箱。

从代码判断,您在toJson函数中发现了一个实际的错误。为此,我将在github上提交一个问题。与此同时。我建议您只需切换到gson,它的工作原理几乎相同。@p.streef您可以将问题链接粘贴到此处,以便遵循解决方案吗?感谢Libgdx github中的Sue
ClassB classB = gson.fromJson(json,ClassB.class);
"    {\"class\": \"net.your.package.ClassA\", \"x\":3, \"y\":5},\n"