2017-12-15 19 views
0

GSRをRetrofitで使用しています。空の配列フィールドの逆シリアル化を無効にしたいAndroid GSONは空の配列をデシリアライズします

DTO:

public class Entity implements Serializable { 

    @SerializedName("body") 
    @Expose 
    private BodyObject body; 

私はrest APIで動作します。体のフィールドが空の場合、それは空のArrayを送信:

{ 
"body": [] 
} 

例外:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 443 path $.body 

体が満たされている場合、彼らは正しいオブジェクトを送信します。

{ 
    "body": { 
    "und": [ 
     { 
     "value": "Test ....", 
     "summary": "", 
     "format": "filtered_html", 
     "safe_value": "<p>Test ....</p>\n", 
     "safe_summary": "" 
     } 
    ] 
    } 
} 

-

Gson gson = new GsonBuilder() 
       .setLenient() 
       .create(); 

どのように私は、これらの空の配列のdeserializationsを削除、または無効にできますか?

+0

あなたとあなたの質問の最後にビルドされた 'GSON'オブジェクトによって' JSON'のシリアル化が行われますか?あなたは 'BodyObject'を添付できますか? – pirho

答えて

0

Alramaは、自分自身でJsonDeserializerを作成することでこのような状況を回避できると示唆しました。

public class BodyObjectDeserializer implements JsonDeserializer<BodyObject> { 
    @Override 
    public BodyObject deserialize(JsonElement json, Type typeOfT 
           ,JsonDeserializationContext context) 
     throws JsonParseException { 
     try { 
     return new Gson().fromJson(json, typeOfT); 
     } catch (JsonSyntaxException e) { 
     log.warn("Body seems empty: {}",e.getMessage()); 
     } 
     return null; 
    } 
} 

とあなたは、シリアル化を解除するために使用し、あなたのGSONでそれを登録するよう

何か。

Gson gson = new GsonBuilder() 
     .setLenient() // maybe you do not need this 
     .registerTypeAdapter(BodyObject.class, new BodyObjectDeserializer()) 
     .create(); 
0

rest APIはオブジェクト定義を尊重する必要があります。オブジェクトは配列になることはありません。残りのAPIを修正できなかった場合は、JSONに空の配列が含まれているかどうかを最初にチェックして、カスタムデシリアライザでこのオブジェクトを管理できます。 GSON custom deserializer

+0

はい。そうすべき。しかし、このRest APIは私にとっては変わりません。だから私はそれを使用する必要があります。 – vihkat

関連する問題