Json parse to HashMap<ArrayList<>>在 Libgdx 中抛出 StackOverflowError?



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);

最新更新