इस प्रश्न के लिए बेहतर शब्दों के बारे में सोच नहीं किया जा सका deserializing, लेकिन मूल रूप से मैं 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" }
}
यह वह जगह है वर्ग कि आंदोलन इंटरफ़ेस मैं deserialize करना चाहते हैं:
public class PlayerController {
private Player player;
private DelayTimer movementDelay;
private Movement movement;
public PlayerController() {
}
[...]
}
मैंने लिखा एक कस्टम 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());
}
}
}
मैं deserializer पंजीकृत:
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());
}
तो मैं वर्ग कि आंदोलन इंटरफ़ेस शामिल deserialize करने की कोशिश की:
playerController = gson.fromJson(new FileReader("data/player_data/player_data.json"), PlayerController.class);
लेकिन मैं इस त्रुटि मिलती है:
ERROR:Unable to invoke no-args constructor for interface controller.Movement. Register an InstanceCreator with Gson for this type may fix this problem.
मैं क्या आवश्यकता है इस काम करने के लिए प्राप्त करने के लिए? लोड करने के लिए एक वर्ग को निर्दिष्ट करने के विचार वसंत के सेम config सामान से आया है - यकीन नहीं वहाँ यह करने के लिए एक बेहतर तरीका है।
ओह, और मैंने जो कुछ किया उसके आसपास पढ़ने से, मैंने निर्धारित किया कि मुझे आंदोलन के लिए एक इंस्टेंट क्रिएटर बनाना नहीं चाहिए। मैं, एक कस्टम deserializer प्रदान कर रहा हूँ सब के बाद ...
चीयर्स।
हाँ, यह करता है: सार्वजनिक वर्ग TopDownGridMovement कार्यान्वयन लागू करता है { सार्वजनिक TopDownGridMovement() {}} – Mitch