J'ai une classe MySimpleObject qui a plusieurs champs membres. Étant donné un json, il va peupler le champ en conséquence. Cependant si le json est indiqué comme "nul", j'ai l'intention de le mettre à null au lieu de la chaîne "nil".Comment écrire commun deserializer GSON personnalisé pour tous les domaines d'une classe?
L'exemple ci-dessous devrait résulter en un objet MySimpleObject avec null pour tous ses champs, et une liste de longueur 0 de subItemList
. myObj1
doit être égal à myObj2
.
@Test
public void myTestFunction() {
String myJson1 = "{\"item1\":\"nil\",\"item2\":\"nil\",\"subItemList\":[{\"subItem1\":\"nil\",\"subItem2\":\"nil\"}]}";
String myJson2 = "{\"subItemList\":[]}";
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(new TypeToken<List<MySubItems>>(){ }.getType(), new MyOwnListDeserializer());
gsonBuilder.registerTypeAdapter(String.class, new MyOwnStringDeserializer());
Gson gson = gsonBuilder.create();
MySimpleObject myObj1 = gson.fromJson(myJson1, MySimpleObject.class);
MySimpleObject myObj2 = gson.fromJson(myJson2, MySimpleObject.class);
assertThat(myObj1.equals((myObj2))).isTrue();
}
class MySimpleObject implements Serializable {
String item1 = null;
String item2 = null;
List<MySubItems> subItemList;
@Override
public int hashCode() {
int hash = 17;
hash = 31*hash + ((item1 == null)? 0 :item1.hashCode());
hash = 31*hash + ((item2 == null)? 0 :item2.hashCode());
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof MySimpleObject) {
return this.hashCode() == obj.hashCode();
}
return super.equals(obj);
}
}
class MySubItems implements Serializable {
String subItem1 = null;
String subItem2 = null;
@Override
public int hashCode() {
int hash = 17;
hash = 31*hash + ((subItem1 == null)? 0 :subItem1.hashCode());
hash = 31*hash + ((subItem2 == null)? 0 :subItem2.hashCode());
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof MySubItems) {
return this.hashCode() == obj.hashCode();
}
return super.equals(obj);
}
}
Comment écrire le sérialiseur personnalisé sans avoir à boucle à travers chaque JSONObject et vérifier « néant » pour définir null?
Merci. J'aime votre réponse hors de la boîte de pensée. Ma question n'est pas très correcte auparavant. Je l'ai modifié. Pouvez-vous vérifier si vous pourriez avoir la réponse maintenant? Remercier!! – Elye
J'ai essayé votre réponse, c'est aussi donner un bon résultat. Je l'ai surpassé. Merci! – Elye