GSON et InstanceCreator problème
J'ai le texte suivant Pojo:
public interface Shape {
public double calcArea();
public double calcPerimeter();
}
public class Rectangle implement Shape {
//Various properties of a rectangle
}
public class Circle implements Shape {
//Various properties of a circle
}
public class ShapeHolder {
private List<Shape> shapes;
//other stuff
}
Je n'ai pas de problème à se GSON pour sérialiser une instance de ShapeHolder
en JSON. Mais quand j'essaie de désérialiser une Chaîne de JSON de retour dans une ShapeHolder
exemple, j'ai des erreurs:
String shapeHolderAsStr = getString();
ShapeHolder holder = gson.fromJson(shapeHodlderAsStr, ShapeHolder.class);
Jette:
Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for interface
net.myapp.Shape. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:167)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
... rest of stack trace ommitted for brevity
Alors, j'ai cherché ici et commencé à mettre en place mon propre ShapeInstanceCreator
:
public class ShapeInstanceCreator implements InstanceCreator<Shape> {
@Override
public Shape createInstance(Type type) {
//TODO: ???
return null;
}
}
Mais maintenant je suis coincé: je suis seulement un java.lang.reflect.Type
, mais j'ai vraiment besoin d'un java.lang.Object
afin que je puisse écrire un code comme:
public class ShapeInstanceCreator implements InstanceCreator<Shape> {
@Override
public Shape createInstance(Type type) {
Object obj = convertTypeToObject(type);
if(obj instanceof Rectangle) {
Rectangle r = (Rectangle)obj;
return r;
} else {
Circle c = (Circle)obj;
return c;
}
return null;
}
}
Que puis-je faire? Merci à l'avance!
Mise à JOUR:
Par @raffian de la suggestion (le lien qu'il/elle a posté), j'ai mis en place un InterfaceAdapter
exactement comme celui dans le lien (je n'ai pas changé rien). Maintenant, je suis l'exception suivante:
Exception in thread "main" com.google.gson.JsonParseException: no 'type' member found in what was expected to be an interface wrapper
at net.myapp.InterfaceAdapter.get(InterfaceAdapter.java:39)
at net.myapp.InterfaceAdapter.deserialize(InterfaceAdapter.java:23)
Des idées?
OriginalL'auteur IAmYourFaja | 2013-12-07
Vous devez vous connecter pour publier un commentaire.
Avez-vous regarder cette? Ressemble à un gentil propre façon de mettre en œuvre InstanceCreators.
J'ai été en utilisant Gson trop, mais elle est passée à FlexJSON en raison de la sérialisation. Avec Flex, vous n'avez pas besoin d'instance de créateurs, assurez-vous que vos objets ont des getters/setters pour tous les champs en fonction de JavaBean spec, et vous êtes bon pour aller:
InterfaceAdapter
comme le montre l'exemple dans le lien que vous avez posté. J'ai alors enregistré comme un type de l'adaptateur avec leGsonBuilder
(encore une fois, comme le montre l'exemple). Maintenant j'ai un nouveau message d'erreur (voir ma mise à jour en question). Toutes les idées sur ce qui se passe maintenant? Merci encore!Je ne suis pas d'excuses, c'est pourquoi je suis passé à la flexion, à éviter de toute cette merde! 🙂 Est-il une contrainte de vous forçant à utiliser Gson?
Désolé pour le retard de réponse, je suis allé au lit et juste donné FlexJSON un tourbillon. Quel régal! Imaginez que: la sérialisation/désérialisation qui "fonctionne", tout droit sorti de la boîte! Vous avez certainement convertis-moi - merci!
exactement, ça fonctionne, tout simplement, de bienvenue du côté obscur 🙂
OriginalL'auteur raffian
NOTER que FlexJSON est l'ajout d'un nom de classe dans le cadre de json comme ci-dessous sérialiser temps.
Donc JSON sera encombrent certains; mais vous n'avez pas besoin d'écrire
InstanceCreator
qui est nécessaire à la GSON.OriginalL'auteur Kanagavelu Sugumar