[java] Jackson으로 직렬화 (JSON)- “직렬화기를 찾을 수 없습니다”?

Jackson을 사용하여 매우 간단한 객체를 직렬화하려고 할 때 예외가 발생합니다. 오류:

org.codehaus.jackson.map.JsonMappingException : MyPackage.TestA 클래스에 대한 시리얼 라이저가없고 BeanSerializer를 작성하는 특성이 발견되지 않았습니다 (예외를 피하기 위해 SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS 비활성화)

아래는 직렬화 할 간단한 클래스와 코드입니다.

아무도 내가이 오류가 발생하는 이유를 말할 수 있습니까?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}



답변

이미 설명한 바와 같이 ObjectMapper인스턴스 의 기본 구성 은 공용 필드이거나 공용 게터 / 세터가있는 속성에만 액세스하는 것입니다. 필드를 공용으로 만들거나 공용 게터 / 세터를 제공하기 위해 클래스 정의를 변경하는 대안 VisibilityChecker은 다른 속성 표시 규칙을 지정하는 것입니다. Jackson 1.9는이를위한 ObjectMapper.setVisibility()편리한 방법을 제공합니다 . 원래 질문의 예에서는 다음과 같이 구성했을 것입니다.

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

Jackson> 2.0의 경우 :

myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

관련 구성 옵션에 대한 자세한 정보 및 세부 사항 은 JavaDocs on을ObjectMapper.setVisibility() 검토 하는 것이 좋습니다 .


답변

Jackson이 해당 클래스를 직렬화하려면 SomeString필드가 public(지금은 패키지 레벨 분리 임) 또는 getter 및 setter 메소드를 정의해야합니다.


답변

내 소스 코드에서 동일한 문제가 있습니다. 방금 추가했습니다

얻는 사람

세터

문제가 해결되었습니다.


답변

필자의 경우 문제는 Jackson이 속성이나 메소드없이 빈 객체를 직렬화하려고 시도했다는 것입니다.

예외에서 제안한 것처럼 빈 빈에서 실패를 피하기 위해 다음 줄을 추가했습니다.

잭슨 1.9

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

잭슨 2.X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

jackson disable fail_on_empty_beans 에서 간단한 예를 찾을 수 있습니다.


답변

나는 컨트롤을 가진 자식 클래스에 대해 같은 문제가 있었고, 객체 매퍼는 공통 모듈에 있었고 액세스 할 수 없었습니다. 객체를 직렬화 할 자식 클래스 에이 주석을 추가하여 문제를 해결했습니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)


답변

해당 객체가 포함 된 클래스를 편집 할 수 있다면 일반적으로 주석을 추가합니다.

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore
NonSerializeableClass obj;


답변

이 오류는 반환 상태에 .build () 메서드를 추가하지 않은 경우에도 발생합니다.

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

build () 메소드없이 다음 오류가 발생했습니다.

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl