Json解析为HashMap <arraylist <>&gt;在Libgdx中抛出StackOverflowError?

时间:2017-03-27 19:14:46

标签: 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;
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实例?

2 个答案:

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