Java Json解析到HashMap<;ArrayList<&燃气轮机&燃气轮机;在Libgdx中抛出堆栈溢出错误?
我的Json是: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
{
"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"