My 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));
}
我使用"Libgdx","json.fromJson"工作正常,当我调用"json.toJson(classB("时,会抛出异常:
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)
...
当我从 ClassB 中的 HashMap 将"ArrayList">更改为 String(etc( 时,代码工作正常。
那么为什么当我使用"ArrayList"时会出现异常,如何将我的 json 解析为 ClassB 实例?
是的,StackOverflowException本身就是一个错误。
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
以避免自动装箱。
按照评论中的要求。
在此处将 libGDX 错误作为新问题发布。
将其添加到您的 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);