Mit*_*tch 6 java json interface class gson
想不出更好的措辞这个问题,但基本上我想在GSON中存储具体类的名称(参见"运动"):
{
"player" : {
"position" : { "x" : 300, "y" : 400 },
"scale" : 1,
"rotation" : 0,
"sprite" : {
"frames" : [ {
"fileName" : "data/plane.png"
} ],
"duration" : 1
}
},
"movementDelay" : { "elapsed" : 0, "started" : 0, "delay" : 150 },
"movement" : { "class" : "controller.TopDownGridMovement" }
}
Run Code Online (Sandbox Code Playgroud)
这是包含我要反序列化的Movement接口的类:
public class PlayerController {
private Player player;
private DelayTimer movementDelay;
private Movement movement;
public PlayerController() {
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
我写了一个Custom Deserializer:
package gson;
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import controller.Movement;
public class MovementDeserialiser implements JsonDeserializer<Movement> {
@Override
public Movement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
JsonObject obj = (JsonObject) json;
Class clazz = Class.forName(obj.get("class").getAsString());
return (Movement) clazz.newInstance();
} catch (Exception e) {
throw new JsonParseException(e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我注册了解串器:
public void registerAdapters(GsonBuilder gsonBuilder) {
gsonBuilder.registerTypeAdapter(Image.class, new ImageDeserialiser());
gsonBuilder.registerTypeAdapter(Button.class, new ButtonDeserialiser());
gsonBuilder.registerTypeAdapter(Animation.class, new AnimationDeserialiser());
gsonBuilder.registerTypeAdapter(Movement.class, new MovementDeserialiser());
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试反序列化包含Movement接口的类:
playerController = gson.fromJson(new FileReader("data/player_data/player_data.json"), PlayerController.class);
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
错误:无法为接口controller.Movement调用no-args构造函数.使用Gson为此类型注册InstanceCreator可以解决此问题.
我需要做些什么才能让它发挥作用?指定要加载的类的想法来自Spring的bean配置 - 不确定是否有更好的方法.
哦,从我所做的阅读中,我确定我不应该为运动创建一个InstanceCreator.毕竟我正在提供一个定制的解串器......
干杯.
啊...我之前一直在需要的地方创建一个新的 Gson 实例,但最近创建了一个 GsonInstance 单例,我用它注册了自定义序列化器。Movement 对象被反序列化的 Gson 对象不是 GsonInstance 对象,所以我猜 Gson 不知道如何序列化它。愚蠢的错误。
tl;dr:我没有使用我正在使用的特定 Gson 实例注册自定义序列化器。
| 归档时间: |
|
| 查看次数: |
8683 次 |
| 最近记录: |