GSON

2011-10-21 12 views
6
में एक अंतरफलक

इस प्रश्न के लिए बेहतर शब्दों के बारे में सोच नहीं किया जा सका 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 प्रदान कर रहा हूँ सब के बाद ...

चीयर्स।

उत्तर

0

आह ... मैं पहले एक नया Gson उदाहरण बनाकर किया गया था जहाँ भी मैं एक जरूरत है, लेकिन हाल ही में एक GsonInstance सिंगलटन कि मैं पंजीकृत बनाई मेरी के साथ कस्टम serializers। Gson उद्देश्य यह है कि आंदोलन वस्तु से deserialized किया जा रहा था तो Gson यह कैसे क्रमानुसार करने मुझे लगता है कि पता नहीं था, GsonInstance वस्तु नहीं था। मूर्खतापूर्ण गलती।

tl; डॉ: मैं विशेष रूप से Gson उदाहरण मैं उपयोग कर रहा था के साथ कस्टम serializer पंजीकृत नहीं किया था।

0

सत्यापित करें controller.TopDownGridMovement में कोई तर्क नहीं है। यदि ऐसा नहीं होता है तो आप वर्ग का एक उदाहरण का उपयोग नहीं बना सकते हैं:

return (Movement) clazz.newInstance(); 
+0

हाँ, यह करता है: सार्वजनिक वर्ग TopDownGridMovement कार्यान्वयन लागू करता है { सार्वजनिक TopDownGridMovement() {}} – Mitch