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

retrofit의 onFailer 함수에서 Expected name at line 1 column 546 path $.response.body.items[0].insttCode 에러가 뜨는데 도저히 모르겠습니다.

0 추천

<구성한 retrofit 데이터형식입니다.>

public class Items {
    @SerializedName("fstvlNm") //축제명
    @Expose
    private String fstvlNm;
    @SerializedName("opar") //개최장소
    @Expose
    private String opar;
    @SerializedName("fstvlStartDate") //축제시작일자
    @Expose
    private String fstvlStartDate;
    @SerializedName("fstvlEndDate") //축제종료일자
    @Expose
    private String fstvlEndDate;
    @SerializedName("fstvlCo") //축제내용
    @Expose
    private String fstvlCo;
    @SerializedName("mnnst") //주관기관
    @Expose
    private String mnnst;
    @SerializedName("auspcInstt") //주최기관
    @Expose
    private String auspcInstt;
    @SerializedName("suprtInstt") //후원기관
    @Expose
    private String suprtInstt;
    @SerializedName("phoneNumber") //전화번호
    @Expose
    private String phoneNumber;
    @SerializedName("homepageUrl") //홈페이지주소
    @Expose
    private String homepageUrl;
    @SerializedName("relateInfo") //관련정보
    @Expose
    private String relateInfo;
    @SerializedName("rdnmadr") //소재지도로명주소
    @Expose
    private String rdnmadr;
    @SerializedName("lnmadr") //소재지지번주소
    @Expose
    private String lnmadr;
    @SerializedName("latitude") //위도
    @Expose
    private String latitude;
    @SerializedName("longitude") //경도
    @Expose
    private String longitude;
    @SerializedName("referenceDate") //데이터기준일자
    @Expose
    private String referenceDate;
    @SerializedName("insttCode") //제공기관코드
    @Expose
    private String insttCode;
}

 

 

<밑의 링크는 json데이터 요청구조입니다.>

http://api.data.go.kr/openapi/tn_pubr_public_cltur_fstvl_api?serviceKey=flqNpXIymv5sUe63nK6VOIcPpe4Gjh3ms%2FuIsRg9nYrtrsoRAzNWiBCGzxczHzbgNa0PSOgF3ROfJZYDaqybfA%3D%3D&pageNo=0&numOfRows=100&type=json

 

-> retrofit의 onFailer 함수에서 Expected name at line 1 column 546 path $.response.body.items[0].insttCode 에러가 떠서 해당 줄의 postman에서 json 요청값을 보았더니 "fstvlEndDate" 였습니다. json 구조대로 나열했을 뿐인데 546번째 코드에 "fstvlEndDate"가 아닌 "insttCode"가 놓여있다고 에러를 해석을 하였습니다. 에러코드를 보고 제가 생각했던 에러 해결방법은 다음과 같았습니다.

1. "items의 구조가 "insttCode" 이후 반점이 찍여있는데 아이템이 더 있는것이라고 생각하고 items 클래스에 serialzedName을 하나 더 추가한다. 하나 더 추가한다면 빈칸에 대한 serialzedName을 어떻게 정의해야 하는가?" 였습니다.

 

2. 두번째는 "items 클래스에 json데이터를 보고 선언한 순서를 다른 것으로 바꿔본다. 그런데, 어떻게 바꿔야 에러 메시지에 맞게 구조가 변할까?" 였습니다.

만약 두가지 중 맞는것이 있다면 해결방법을 알려주시면 감사하겠습니다. 둘다 아니라면, 다른 해결책에 대해 알려주세요.  

안드11 (330 포인트) 님이 2021년 2월 21일 질문

1개의 답변

0 추천
쉽게 떠올릴 수 있는 옵션은 Retrofit 에서 해당 API를 String으로 받은 다음 콤마를 제거하시고 Gson으로 파싱하시면 될 것 같은데요..

이걸 Retrofit에 커스텀 adapter로 등록하실 수도 있구요.

 

그런데, 제일 바람직한 방법은 해당 API를 고쳐달라고 하시는 게 맞을 듯 해요. 왜냐하면 응답데이트를 조작하는 것은 어떤 경우에도 하면 안되는 방법이기 때문입니다. 모발앱은 서버가 주는 응답 그대로를 사용하는게 맞아요. 위의 경우는 아주 작은 것이긴 하지만요.
spark (226,420 포인트) 님이 2021년 2월 21일 답변
spark님이 2021년 2월 21일 수정
...