Prefácio
Nos projetos de desenvolvimento reais, o servidor geralmente usa a string vazia "" como resultado de retorno para representar o valor vazio, mas isso encontrará problemas no GSON. Se o tipo desses dados não for uma string, o GSON relatará um erro ao analisá -los.
Exceção JSON
Vamos primeiro olhar para um JSON voltou em segundo plano
Em circunstâncias normais JSON:
{"code": 0, "msg": "ok", "dados": {"id": 5638, "newsid": 5638}}A classe de entidade correspondente à parte dos dados:
classe pública jsonbean {private int id; Private 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; }}Exceção JSON (os dados correspondentes não são encontrados no campo do banco de dados em segundo plano):
{"code": 0, "msg": "ok", "dados": {"id": 5638, "newsid": ""}}Dessa forma, o GSON lançará uma exceção com erros de análise ao analisar, e o aplicativo trava porque não pode se converter "" em INT
Manuseio de exceções JSON
Esperamos que, quando a exceção do JSON retornada em segundo plano possa ser analisada com sucesso, o valor nulo correspondente é convertido no valor padrão, como: newsId=0;
Aqui excluímos as correções para você quando os desenvolvedores de fundo saem, ainda temos que confiar em nós mesmos-
Escrevemos um conversor de tipo para valores int, que precisa implementar a interface JsonSerializer<T> do GSON e JsonDeserializer<T> , isto é, interfaces de serialização e desserialização
classe pública IntegerDefault0Adapter implementa o JSOnserializer <Teger>, JSondeSerializer <Integer> {@Override public integermeialize (JSonelement JSON, TypeOft, JSONDESERIALIZATIONCONTEXT contexto) lança JSONPARSEXCECCE ({Try), (JSONDERSERICONTEXT) json.getasstring (). igual ("null")) {// define como tipo int, se o plano de fundo retornar "" ou nulo, retornar 0; }} catch (exceção ignorar) {} tente {return json.getasint (); } catch (numberFormatexception e) {lança nova jsonsyntoxException (e); }} @Override public jSonelement Serialize (Inteiro SRC, tipo TypeofSrc, JSOnserializationContext Context) {return jsonPrimitive (SRC); }} Da mesma forma, tipos longos e duplos
duplo =>
classe pública DoubleDefault0Adapter implementa o JSOnserializer <OWLOUE>, JSONDERSERIALIZER <HUDLE> {@Override public Double Deserialize (JSonelement JSON, tipo Typeoft, JSondeserializationContext Context) lança JSONPARSEEXCIÇÃO {Try {if (json.getStRing). json.getasstring (). igual ("null")) {// define como tipo duplo, se o plano de fundo retornar "" ou nulo, retornar 0,00 retornar 0,00; }} catch (exceção ignorar) {} tente {return json.getasdouble (); } catch (numberFormatexception e) {lança nova jsonsyntoxException (e); }} @Override public JSonelement Serialize (Double Src, Type TypeofSrc, JSOnserializationContext Context) {return novo JSONPrimitive (SRC); }}long =>
classe pública LongDefault0Adapter implementa o JSOnserializer <long>, JSondeSerializer <long> {@Override public Long Desserialize (JSonelement JSON, Type Typeoft, JSondeSerialization Context Context) lança JSONparseException {Try {if (json.getAssTing). json.getasstring (). igual ("null")) {// Defina o tipo tão longo, se o plano de fundo retornar "" ou nulo, retornar 0l; }} catch (exceção ignorar) {} tente {return json.getaslong (); } catch (numberFormatexception e) {lança nova jsonsyntoxException (e); }} @Override public JSonelement Serialize (longo src, type typeofsrc, contexto jsonserializationContext) {return jsonprimitive (src); }}Portanto, o uso é assim:
Retorno new Retrofit.Builder () .Client (OkhttpClient) // Definir estrutura de acesso à rede. .build ();/** * Adicione o processamento de "" e "nulo" no fundo * 1.Int => 0 * 2.DOUBLE => 0,00 * 3.long => 0l * * @return */public static gson Builtgson () {if (gson == null) {gson = newger.gsonbuilder (). IntegerDefault0Adapter ()) .RegisterTyPeAdApter (int.class, new IntegerDefault0Adapter ()) .RegisterTyPeadApter (Double.class, new DoubleDefault0Adapter () .RegisterTyPeadApter (Long.class, LongDefault0Adapter (). LongDefault0Adapter ()) .create (); } retornar gson;}Nunca vai cair porque o campo JSON de fundo está vazio novamente
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo seja útil para o estudo ou o trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.