Préface
Dans les projets de développement réels, le serveur utilise souvent la chaîne vide "" comme résultat de retour pour représenter la valeur vide, mais cela rencontrera des problèmes dans GSON. Si le type de ces données n'est pas une chaîne, GSON rapportera une erreur lors de l'analyse.
Exception JSON
Regardons d'abord un JSON retourné en arrière-plan
Dans des circonstances normales JSON:
{"code": 0, "msg": "ok", "data": {"id": 5638, "newsid": 5638}}La classe d'entité correspondant à la partie de données:
classe publique JSONBean {private int id; privé int newsid; public int getID () {return id; } public void setid (int id) {this.id = id; } public int getNewSid () {return newsId; } public void setNewSid (int newsId) {this.newsid = newsId; }}Exception JSON (Les données correspondantes ne se trouvent pas dans le champ NewsID de base de données d'arrière-plan):
{"code": 0, "msg": "ok", "data": {"id": 5638, "newsId": ""}}De cette façon, GSON lancera une exception avec des erreurs d'analyse lors de l'analyse, et l'application se bloque car elle ne peut pas se convertir "" en int
Gestion des exceptions JSON
Nous nous attendons à ce que lorsque l'exception JSON renvoyée en arrière-plan puisse être analysée avec succès, la valeur nul correspondante est convertie en valeur par défaut, telle que: newsId=0;
Ici, nous excluons les corrections pour vous lorsque les développeurs de fond sachent, nous devons encore compter sur nous-mêmes -
Nous écrivons un convertisseur de type pour les valeurs int, qui doit implémenter l'interface JsonSerializer<T> de GSON et JsonDeserializer<T> , c'est-à-dire les interfaces de sérialisation et de désérialisation
classe publique IntegerDefault0Adapter implémente JSonSerializer <Integer>, JSonSeSerializer <Integer> {@Override public Integer Deserialize (JSONElement JSON, Type Typeoft, JSonSeRalizationContext Context) lance JSONPARSEException {try {if (json.getAssTring (). json.getAsstring (). equals ("null")) {// définir comme type int, si l'arrière-plan renvoie "" ou null, return 0; }} catch (exception ignore) {} try {return json.getasint (); } catch (NumberFormatexception e) {Throw New JSonsyNTaxException (E); }} @Override public JSONElement serialize (entier src, type typeofSrc, jsonSerializationContext context) {return new JSONPrimitive (src); }} De même, les types longs et doubles
double =>
La classe publique DoubleDefault0Adapter implémente JSonSerializer <Double>, JSonSeSerializer <Double> {@Override public Double Deserialize (JSONElement JSON, Typeoft, JSondeSerializationContext Context lance JsonParseException {Try {if (json.getAssstring (). Equals ("" ") || json.getAsstring (). equals ("null")) {// définir comme double type, si l'arrière-plan renvoie "" ou null, retour 0,00 retour 0,00; }} catch (exception ignore) {} try {return json.getAsDouble (); } catch (NumberFormatexception e) {Throw New JSonsyNTaxException (E); }} @Override public JSonElement serialize (double src, type typeofSrc, jsonSerializationContext context) {return new JSONPrimitive (src); }}long =>
classe publique LongDefault0Adapter implémente JSonSerializer <long>, JSonSeSerializer <long> {@Override public Long Deserialize (JSONElement JSON, Typeoft, JSonSeSerializationContext Context) lance JSONParseException {try {if (json.getAssstring (). Equals ("" ") || json.getAsstring (). equals ("null")) {// définir comme un type long, si l'arrière-plan renvoie "" ou null, return 0l; }} catch (exception ignore) {} try {return json.getaslong (); } catch (NumberFormatexception e) {Throw New JSonsyNTaxException (E); }} @Override public JSONElement serialize (long src, type typeOfSrc, jNonSerializationContext context) {return new JSONPrimitive (src); }}L'utilisation est donc comme ceci:
return new restrofit.builder () .client (okhttpclient) // Définir le réseau d'accès réseau.addConverterFactory (gsonconverterfactory.create (buildgson ())) // ajouter json framework.addcalladapterfactory (rxjavacalladapterfactory.create () // let restrofit se soucier de rxjavacaldapterfactory.create ()) // Rxjava.baseurl (substanl) .build (); / ** * Ajoutez le traitement de "" et "null" en arrière-plan * 1.int => 0 * 2.Double => 0.00 * 3.Long => 0l * * @return * / public static buildgson () {if (gson == null) {gson = new gsonbuilder () .RegisterTypeAdapter (Integer.class, new IntegerDefault0Adapter ()) .RegisterTypeAdapter (int.class, new IntegerDefault0Adapter ()) .RegisterTypeAdapter (Double.class, New Doublefault0Adapter ()).).). .RegisterTypeAdapter (long.class, new longDefault0Adapter ()) .Create (); } return gson;}Ne s'écrasera plus jamais parce que le champ JSON de fond est à nouveau vide
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article sera utile à l'étude ou au travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer.