Problème avec parser json pour objet java à l'aide de gson
Je veux analyser les données json en objet java à l'aide de google-gson.
Voici un exemple des données que je veux analyser:
{"isBean":{"userName":"test","password":"password112"}}
IsBean.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
User.java
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
RequestObj.java
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() {
return 0;
}
public IsBean getIsBean() {
return isBean;
}
public void setIsBean(IsBean isBean) {
this.isBean = isBean;
}
}
Test.java
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
User user=new User();
user.setPassword("password112");
user.setUserName("test");
RequestObj requestObj=new RequestObj();
requestObj.setIsBean(user);
String jsonStr=gson.toJson(requestObj);
System.out.println("jsonStr--->"+jsonStr);
try{
RequestObj request=gson.fromJson(jsonStr, RequestObj.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Erreur:
java.lang.RuntimeException: Unable to invoke no-args constructor for interface com.test.gson.shared.IsBean. 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)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.Gson.fromJson(Gson.java:795)
at com.google.gson.Gson.fromJson(Gson.java:761)
at com.google.gson.Gson.fromJson(Gson.java:710)
at com.google.gson.Gson.fromJson(Gson.java:682)
at com.test.gson.server.Test.main(Test.java:18)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:48)
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:164)
... 8 more
Caused by: java.lang.InstantiationException: com.test.gson.shared.IsBean
at sun.misc.Unsafe.allocateInstance(Native Method)
... 14 more
OriginalL'auteur bNd | 2012-12-14
Vous devez vous connecter pour publier un commentaire.
Sans voir le code de
CommunicationObject
, je ne peux pas dire pour sûr, MAIS je devine avec confiance que la classe a un champ de typeIsBean
dans lequel vous l'utilisez pour tenir leUser
. Si oui, le problème est que GSON analyses des champs de l'objetobj
de la classeCommunicationObject
et basé sur la définition d'un champ, la valeur du champ (ce qui est tapéIsBean
) devront être créés, MAIS puisque le type est une interface, il ne peut pas l'instance de l'objet pour ce champ.D'autres termes, en tant que champ JSON ne spécifie pas le type d'objet, GSON doit s'appuie sur la définition de type de champ pour créer l'instance de la valeur du champ qui ne peut pas être fait si le type est une interface.
À envisager de changer le type de ce champ si qui ont du sens pour vous. OU regarder dans la création de
InstanceCreator
deIsBean
(doute qu'il est logiquement possible).Voir aussi: La désérialisation d'une classe abstraite dans Gson
Espère que cette aide.
Comme je le soupçonnais. Malheureusement interface (classe abstraite) champ sera, par défaut, une façon de créer son instance. Donc, vous avez à décider ce qui est le type par défaut pour
IsBean
.OriginalL'auteur NawaMan
Le problème est résolu Avec l'aide de Stackoverflow Réponse.
Créer gson objet:
OriginalL'auteur bNd