2017-12-15 15 views
0

GSON을 개조하고 있습니다. 빈 배열 필드 deserialization 해제하려면 싶습니다.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

'JSON'에 대한 직렬화는 귀하와 귀하의 질문 끝에 작성되는 'GSON' 객체에 의해 수행됩니까? '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

휴식 API는 객체 정의를 존중해야합니다. 객체는 결코 배열이 될 수 없습니다. 나머지 API를 수정할 수 없다면 JSON에 빈 배열이 포함되어 있는지 먼저 확인하고 맞춤 비 직렬 자로이 객체를 관리 할 수 ​​있습니다. GSON custom deserializer

+0

예. 그것해야합니다. 하지만이 Rest API는 나에게 변경 될 수 없습니다. 그래서 그것을 사용해야합니다. – vihkat