마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

json에러 대처법은 없는지 궁금합니다.

0 추천
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance에러.

json property의 데이타가 안넘어왔을때 defaultVaule를 줄수있는 방법은 없는지 궁금합니다.

3일째 삽질중인데 방법이 보이지 않네요..조언좀 부탁드립니다.
한라산산적 (340 포인트) 님이 2016년 9월 30일 질문
가능하시다면 기본적인 api설계를 변경하셔야 합니다. 모바일 클라이언트는 서버의 api를 consuming하기만 하는 쪽이 되어야 합니다. 서버에서 처리 도중 바랭한 에러도 서버에서 핸들링 되어서 일반 응답과 동일한 포맷으로 리턴해야 합니다. 클라이언트가 파킷의 포맷을 체크해서 대응하는 것은 좋지않은 프랙티스입니다.
하지만 api의 변경이 어려운 경우라면 아랫분처럼 try except를 사용해서 처리하거나 해당 패킷을 검사해서 정상 응답인지 에러응답인지 확인하셔야 겠죠.
그리고 변경이 가능하다면 아랫처럼
{
 success : true,
 message: "error message",
 payload: your reponse object
}
와 같은 포맷으로 모든 경우에 적용할 수 있도록 하면 좋을 듯 합니다.

1개의 답변

0 추천
생성한 object mapper 에 다음 옵션을 넣어보세요

mMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
aucd29 (218,390 포인트) 님이 2016년 9월 30일 답변
지금 데이타가 성공시에는
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * Created by pass1 on 2016-09-29.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public class JindoData {

    @JsonProperty("progress_rt") public int progress_rt;
    @JsonProperty("recommend_progrees_rt") public int recommend_progress_rt;
}
public List<JindoData> jindoDataList; 이런형태로 넘어오며

실패 시에는 {"result":"FAIL","code":"200","message":"실패사유"}이렇게 넘어옵니다.
이런경우는 어떻게 매핑해야 할지 난감하네요..ㅠ
이런것도 있군요 ㅋ 저같은 경우는 일반 simple-json 라이브러리 가져다 써서 파싱 에러인 경우에는 catch구문에서 예외 처리 해주는데
json property 필요 없으시구요 implements Serializable 넣으시고
serialVersionUID 를 생성하세요

String result
String code
String message 도 포함하세요

해당 데이터는 모든 항목에 적용될 가능성이 높으니 별도 클래스를 생성해서 extends 하시는것도 괜찮습니다.
대략 이런 코드랄까요

public class ErrorResponse implements Serializable {
    private static final long serialVersionUID = 3586105721745211832L;

    protected String result
    protected String code
    protected String message

    public String getResult() {
        return result;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

public class JindoData extends ErrorResponse implements Serializable {
    private static final long serialVersionUID = 1235105721745211832L;

    private int progress_rt;
    private int recommend_progrees_rt

    public int getProgressRt() {
        return progress_rt;
    }

    public String getRecommendProgressRt() {
        return recommend_progrees_rt;
    }
}
serialVersionUID 생성법은 인터넷 뒤져보세요 자동 생성 됩니다.
...