Предисловие
В реальных проектах разработки сервер часто использует пустую строку «в качестве результата возврата для представления пустого значения, но это будет столкнуться с проблемами в GSON. Если тип этих данных не является строкой, GSON сообщит об ошибке при его анализе.
JSON Exception
Давайте сначала посмотрим на JSON, вернувшийся на задний план
При нормальных обстоятельствах json:
{"code": 0, "msg": "ok", "data": {"id": 5638, "newsid": 5638}}Класс объектов, соответствующий детали данных:
Public Class JSONBEAN {Private Int ID; частный int newsisid; public int getId () {return id; } public void setId (int id) {this.id = id; } public int getNewsId () {return newsid; } public void setNewsId (int newSebId) {this.newsid = newsid; }}Исключение JSON (соответствующие данные не найдены в фоновой базе данных Newsid в поле):
{"code": 0, "msg": "ok", "data": {"id": 5638, "newsid": ""}}Таким образом, GSON будет бросить исключение с ошибками разбора при анализе, а приложение срабатывает, потому что оно не может преобразовать «в Int
Обработка исключений JSON
Мы ожидаем, что, когда исключение JSON, возвращаемое в фоновом режиме, может быть успешно проанализировано, соответствующее нулевое значение преобразуется в значение по умолчанию, например: newsId=0;
Здесь мы исключаем исправления для вас, когда выходу из фона разработчиков, нам все равно приходится полагаться на себя ...
Мы пишем конвертер типа для значений int, который должен реализовать интерфейс JsonSerializer<T> и JsonDeserializer<T> , то есть интерфейсы сериализации и пустыни
открытый класс IntegerDefault0Adapter реализует jsonserializer <Integer>, jsondeserializer <Integer> {@override public integer deserialize (jsonelement json, type typeoft, jsondeserializationcontext context) throws jsonparseexception {try {if (json.getString (). json.getAsstring (). equals ("null")) {// определить как тип int, если фон возвращает "или null, return 0; }} catch (исключение игнорировать) {} try {return json.getAsint (); } catch (numberFormateXception e) {бросить новый jsonsyntaxException (e); }} @Override public jsonElement serialize (Integer src, type typeofsrc, JsonserializationContext context) {return new jsonPrimitive (src); }} Точно так же длинные и двойные типы
Double =>
Public Class Doublefault0Adapter реализует Jsonserializer <Double>, JSondeserializer <way> {@Override Public Double Deserialize (Jsonelement JSON, Type Typeoft, JSondeserializationContext Контекст). json.getAsstring (). equals ("null")) {// определить как двойной тип, если фон возвращает "или null, возврат 0,00 return 0.00; }} catch (исключение игнорировать) {} try {return json.getasDouble (); } catch (numberFormateXception e) {бросить новый jsonsyntaxException (e); }} @Override public jsonElement serialize (двойной src, type typeofsrc, контекст JsonserializationContext) {return new jsonPrimitive (src); }}long =>
открытый класс LongDefault0Adapter реализует Jsonserializer <long>, JSondeserializer <long> {@Override Public Long Deserialize (JSONELEMENT JSON, TYPE TYPEOFT, JSONDEREALIAGAILCONCENTEXTEXTEXTEXTEXT) THROHS JSONPARSEEXCEPTER {Try {if (json.getString (). json.getAsstring (). equals ("null")) {// определить как длинный тип, если фон возвращает "или null, return 0l; }} catch (исключение игнорировать) {} try {return json.getAslong (); } catch (numberFormateXception e) {бросить новый jsonsyntaxException (e); }} @Override public jsonElement serialize (long src, type typeofsrc, jsonerializationcontext context) {return new jsonprimitive (src); }}Так что использование такова:
вернуть новый mrowit.builder () .client (okhttpclient) // set frameworks framework.addconverterfactory (gsonconverterfactory.create (buildgson ())) // Добавить json преобразование. Rxjava.baseurl (baseurl) .build ();/** * Добавить обработку "" и "null" на заднем плане * 1.int => 0 * 2. double => 0.00 * 3. long => 0l * * @Return */public gsongson buildgson () {if (gson = nul .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter()) .registerTypeAdapter(int.class, new IntegerDefault0Adapter()) .registerTypeAdapter(Double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(Long.class, new LongDefault0Adapter()) . RegisterTyPeadApter (long.class, new longdefault0adapter ()) .create (); } return gson;}Никогда не будет сбой, потому что фон json снова пусто
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи будет полезно для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.