我的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;
import java.util.ArrayList;
import java.util.HashMap;
public class ClassA{
public Integer x, y;
}
public class ClassB{
public HashMap<String, ArrayList<ClassA>> objects;
}
public static void main(String[] args) {
Json json = new Json();
ClassB classB = json.fromJson(ClassB.class, "{\n" +
" \"objects\":{\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));
}
我使用&#34; Libgdx&#34;,&#34; json.fromJson&#34;工作正常,当我打电话给&#34; json.toJson(classB)&#34;抛出异常:
Exception in thread "main" java.lang.StackOverflowError
at com.badlogic.gdx.utils.JsonWriter$OutputType.quoteValue(JsonWriter.java:187)
at com.badlogic.gdx.utils.JsonWriter.value(JsonWriter.java:88)
at com.badlogic.gdx.utils.Json.writeValue(Json.java:574)
at com.badlogic.gdx.utils.Json.writeFields(Json.java:290)
at com.badlogic.gdx.utils.Json.writeValue(Json.java:580)
at com.badlogic.gdx.utils.Json.writeFields(Json.java:290)
at com.badlogic.gdx.utils.Json.writeValue(Json.java:580)
...
当我将&#34; ArrayList&#34; 更改为来自 ClassB 中 HashMap 的字符串(等)时>代码工作正常。
当我使用&#34; ArrayList&#34;时,为什么会出现异常现象?以及如何将我的json解析为ClassB实例?
答案 0 :(得分:1)
是的,StackOverflowException本身就是一个bug。
libGDX'JSON类在某些地方需要类类型信息,如果它不能自己推断出类型。在这方面,它比其他更大的图书馆(如Gson)更不容忍。
请参阅:https://github.com/libgdx/libgdx/wiki/Reading-%26-writing-JSON#writing-object-graphs
您示例中最简单的修复方法是将ClassA实例编写为:
" {\"class\": \"net.your.package.ClassA\", \"x\":3, \"y\":5},\n"
可以缩短类名,请参阅Json.setElementType()。
一般而言,作为最佳实践,对于原型设计,我建议您采用与您的方法相反的方法。在代码中创建结构,然后写入JSON以查看libGDX如何“感知”您的数据结构,然后从JSON读回以验证输出。
附注:对于大多数情况,建议在示例中使用libGDX容器ObjectMap<>
和Array<>
。此外,ClassA成员可能是int
而不是Integer
,以避免自动装箱。
答案 1 :(得分:0)
根据评论中的要求。
将libGDX错误发布为新问题here。
将此添加到build.gradle依赖项(如果使用默认结构,则添加到核心项目中):
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
初始化Gson对象:
Gson gson = new Gson();
使用from和to json函数:
String json = gson.toJson(classB);
和
ClassB classB = gson.fromJson(json,ClassB.class);