투케이2K

305. (TWOK/ERROR) [Android] 안드로이드 jackson - InvalidDefinitionException: Cannot construct deserialize 본문

투케이2K 에러관리

305. (TWOK/ERROR) [Android] 안드로이드 jackson - InvalidDefinitionException: Cannot construct deserialize

투케이2K 2025. 4. 23. 19:31

[환경 설정 및 설명]

프로그램 : AndroidStudio

설 명 : [Android] 안드로이드 jackson - InvalidDefinitionException: Cannot construct deserialize

 

[설 명]

--------------------------------------------------------------------------
[개발 및 테스트 환경]
--------------------------------------------------------------------------

- 제목 : [Android] 안드로이드 jackson 라이브러리 InvalidDefinitionException: Cannot construct deserialize

- 테스트 환경 : 삼성 갤럭시 스마트폰 / 안드로이드 / Android

--------------------------------------------------------------------------





--------------------------------------------------------------------------
[에러 원인]
--------------------------------------------------------------------------

1. jackson 라이브러리 사용해 Json String 정보를 Class 매퍼 클래스로 deserialize 수행 시 

   클래스 구현 정보가 옳바르지 않아 발생하는 이슈


2. Class 내에 기본 Default Struct 클래스 생성자가 선언 되지 않아서 발생하는 이슈


3. 에러 발생 로그 전문 : 

W/System.err: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.javaproject.M_Jackson_User` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
W/System.err:  at [Source: (String)"{"userId":"TWOK123","userName":"투케이","userAge":30,"userAddr":["A","b"]}"; line: 1, column: 2]
W/System.err:     at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904)
W/System.err:     at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
W/System.err:     at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349)
W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352)
W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185)
W/System.err:     at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
W/System.err:     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)
W/System.err:     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629)
W/System.err:     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597)

--------------------------------------------------------------------------





--------------------------------------------------------------------------
[해결 방법]
--------------------------------------------------------------------------

1. Class 클래스 구현 정보 수정 : Default Struct 클래스 생성자 선언 수행


2. Class 구현 예시 : 

public class M_Jackson_User {


    // ------------------------------------------------
    // TODO [전역 변수 선언]
    // ------------------------------------------------
    private String userId; // [사용자 아이디]
    private String userName; // [이름 이름]
    private int userAge; // [사용자 나이]
    private String[] userAddr; // [사용자 주소지]





    // ------------------------------------------------
    // TODO [클래스 생성자 초기화] : [Default]
    // ------------------------------------------------
    public M_Jackson_User() { }





    // ------------------------------------------------
    // TODO [클래스 생성자 초기화] : [Params]
    // ------------------------------------------------
    public M_Jackson_User(String userId, String userName, int userAge, String[] userAddr) {
        this.userId = userId;
        this.userName = userName;
        this.userAge = userAge;
        this.userAddr = userAddr;
    }



    // ------------------------------------------------
    // TODO [Get 정의]
    // ------------------------------------------------
    public String getUserId() {
        return userId;
    }

    public String getUserName() {
        return userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public String[] getUserAddr() {
        return userAddr;
    }



    // ------------------------------------------------
    // TODO [Set 정의]
    // ------------------------------------------------
    public void setUserId(String userId) {
        this.userId = userId;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    public void setUserAddr(String[] userAddr) {
        this.userAddr = userAddr;
    }


} // TODO [클래스 종료]


3. ObjectMapper 사용해 Class 매핑 작업 예시 : 

String jsonData = "{\"userAddr\":[\"A\",\"b\"],\"userAge\":30,\"userId\":\"TWOK123\",\"userName\":\"투케이\"}";

// [ObjectMapper 인스턴스 생성]
ObjectMapper objectMapper = new ObjectMapper();

// [JSON 문자열을 객체로 변환]
M_Jackson_User m_jackson_user = objectMapper.readValue(jsonData, M_Jackson_User.class);

--------------------------------------------------------------------------





--------------------------------------------------------------------------
[참고 사이트]
--------------------------------------------------------------------------

[Jackson 자바 Object to Json 변환 라이브러리]

https://blog.naver.com/kkh0977/223062394936?trackingCode=blog_bloghome_searchlist


[Jackson] 라이브러리 사용해 json to map 변환 실시

https://blog.naver.com/kkh0977/223074905826?trackingCode=blog_bloghome_searchlist


[간단 소스] Jackson 라이브러리 사용해 Class 클래스 정보 Json 변환 - ObjectMapper writeValueAsString

https://blog.naver.com/kkh0977/223841809345

--------------------------------------------------------------------------
 
반응형
Comments