머리말
실제 개발 프로젝트에서 서버는 종종 빈 문자열을 사용하여 빈 값을 나타 내기 위해 반환 결과로 사용하지만 GSON에서 문제가 발생합니다. 이 데이터의 유형이 문자열이 아닌 경우 GSON은 파싱 할 때 오류를보고합니다.
JSON 예외
먼저 백그라운드에서 반환 된 JSON을 보자.
정상적인 상황에서 JSON :
{ "code": 0, "msg": "ok", "data": { "id": 5638, "NewsId": 5638}}데이터 부분에 해당하는 엔티티 클래스 :
공개 클래스 JSONBEAN {private int id; 개인 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; }}예외 JSON (해당 데이터는 배경 데이터베이스 NewsID 필드에서 찾을 수 없습니다) :
{ "code": 0, "msg": "ok", "data": { "id": 5638, "NewsId": ""}}이런 식으로 GSON은 구문 분석 할 때 구문 분석 오류로 예외를 던지고 앱은 "" ""int로 변환 할 수 없기 때문에 충돌합니다.
JSON 예외 처리
배경에서 JSON 예외가 성공적으로 구문 분석 될 수있을 때 해당 NULL 값이 다음과 같은 기본값으로 변환 될 것으로 예상합니다. newsId=0;
여기서 우리는 배경 개발자가 출력 할 때 수정 사항을 제외하고, 우리는 여전히 우리 자신에게 의존해야합니다.
GSON의 JsonSerializer<T> 인터페이스 및 JsonDeserializer<T> , 즉 직렬화 및 사막화 인터페이스를 구현 해야하는 Int 값에 대한 유형 변환기를 작성합니다.
공개 클래스 integerdefault0adapter는 jsonserializer <integer>, jsondeserializer <integer> {@override public integer deserialize (jsonelement json, type typesoft, jsondeserializationcontext context)를 구현합니다. json.getAsstring (). equals ( "null")) {// 배경이 반환되는 경우 int 유형으로 정의하십시오. "또는 null, return 0; }} catch (예외 무시) {} try {return json.getasint (); } catch (numberformatexception e) {throw new jsonsyntaxexception (e); }} @override public jsonlement serialize (Integer SRC, Type TypeofSrc, JSonserializationContext Context) {return new JsonPrimitive (SRC); }} 마찬가지로 길고 이중 유형
double =>
공개 클래스 Doubledefault0adapter는 jsonserializer <double>, jsonserializer <dodl> {@override public double deserialize (jsonlement json, type typeoft, jsondeserializationcontext context)를 구현합니다. json.getAsstring (). equals ( "null")) {// 배경이 반환되는 경우 "또는 null은 0.00을 반환하면 0.00을 반환합니다. }} catch (예외 무시) {} try {return json.getasdouble (); } catch (numberformatexception e) {throw new jsonsyntaxexception (e); }} @override public JsonElement Serialize (Double SRC, Type Type TypeofSrc, JSonserializationContext Context) {return new JsonPrimitive (SRC); }}long =>
공개 클래스 longdefault0adapter는 jsonserializer <long>, jsondeserializer <long> {@override public long deserialize (jsonlement json, type typeoft, jsondeserializationcontext context)를 구현합니다. json.getAsstring (). equals ( "null")) {// 배경이 반환되는 경우 긴 유형으로 정의하십시오. "또는 NULL, 0L을 반환합니다. }} catch (예외 무시) {} try {return json.getaslong (); } catch (numberformatexception e) {throw new jsonsyntaxexception (e); }} @override public jsonlement serialize (long src, type type typeofsrc, jsonserializationcontext context) {return new JsonPrimitive (SRC); }}따라서 사용은 다음과 같습니다.
New Retrofit.Builder () .Client (OKHTTPCLIENT) // 네트워크 액세스 프레임 워크 세트 세트 설정 프레임 워크. ADDCONVERTORY (gsonConverterFactory.Create (buildgson ()) // JSON Conversion Framework.AddCallAdApterFactory (rxjavacalladapterfactory.create ()) // let suppled rxjava.baseurl (baseurl) .build ();/** * 배경에 ""및 "null"의 처리를 추가 * 1.in => 0 * 2. double => 0.00 * 3.long => 0l * * @return */public static gson buildgson () {if (gson == null) {new gsonbuilder (). .registertyPeadapter (integer.class, new integerdefault0adapter ()) .registertyPeadapter (int.class, new integerdefault0adapter ()) .registertyPeadapter (double.class, new DoubleFault0Adapter ()) .registerTyPeadApter (long.class, new longefault0Adapter (long.class, class, class, class, class). .registertyPeadapter (long.class, new longdefault0adapter ()) .create (); } return gson;}배경 JSON 필드가 다시 비어 있기 때문에 절대 충돌하지 않습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.