Json 解析为 HashMap<ArrayList<>> 在 Libgdx 中抛出 StackOverflowError?
Json parse to HashMap<ArrayList<>> throwing StackOverflowError in Libgdx?
我的 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.WhosebugError
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)
...
当我将 "ArrayList" 从 HashMap 更改为 String(etc) 时在 ClassB 中,代码工作正常。
那么为什么在我使用 "ArrayList" 时抛出异常,我如何将我的 json 解析为 ClassB 实例?
按照评论中的要求。
Post 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);
是的,WhosebugException 本身就是一个错误。
libGDX' JSON class 在某些地方期望 class 类型信息,如果它不能自己推断类型的话。在这方面,它比其他更大的库(例如 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"
class名称可以缩短,见Json.setElementType()。
一般来说,作为最佳实践,对于原型制作,我建议采用与您的方法相反的方法。在代码中创建结构,然后写入 JSON 以查看 libGDX "perceives" 您的数据结构,然后从 JSON 回读以验证输出。
旁注:在大多数情况下,建议在您的示例中使用 libGDX 容器、ObjectMap<>
和 Array<>
。此外,A 类成员可能是 int
而不是 Integer
以避免自动装箱。
我的 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.WhosebugError
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)
...
当我将 "ArrayList" 从 HashMap 更改为 String(etc) 时在 ClassB 中,代码工作正常。
那么为什么在我使用 "ArrayList" 时抛出异常,我如何将我的 json 解析为 ClassB 实例?
按照评论中的要求。
Post 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);
是的,WhosebugException 本身就是一个错误。
libGDX' JSON class 在某些地方期望 class 类型信息,如果它不能自己推断类型的话。在这方面,它比其他更大的库(例如 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"
class名称可以缩短,见Json.setElementType()。
一般来说,作为最佳实践,对于原型制作,我建议采用与您的方法相反的方法。在代码中创建结构,然后写入 JSON 以查看 libGDX "perceives" 您的数据结构,然后从 JSON 回读以验证输出。
旁注:在大多数情况下,建议在您的示例中使用 libGDX 容器、ObjectMap<>
和 Array<>
。此外,A 类成员可能是 int
而不是 Integer
以避免自动装箱。