Jackson에서 사용자 정의 Deserializer를 사용하면 기본 deserialization 동작을 확장하거나 수정할 수 있습니다. . 일반적인 요구 사항은 사용자 지정 논리를 적용하기 전에 기본 역직렬 변환기에 액세스하여 개체를 부분적으로 역직렬화하는 것입니다. 그러나 사용자 정의 deserializer 내에서 deserialize를 직접 호출하면 스택 오버플로 예외가 발생합니다.
이 문제를 해결하려면 BeanDeserializerModifier를 구현하고 SimpleModule에 등록할 수 있습니다. 이 수정자는 디시리얼라이저 생성 프로세스 중에 개입하여 기본 디시리얼라이저를 사용자 정의 디시리얼라이저에 주입할 수 있습니다.
다음 코드는 이를 달성하는 방법을 보여줍니다.
import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.module.BeanDeserializerModifier; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.util.StdDeserializer; public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer { private static final long serialVersionUID = 7923585097068641765L; private final JsonDeserializer<?> defaultDeserializer; public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer) { super(User.class); this.defaultDeserializer = defaultDeserializer; } @Override public User deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt); // Special logic return deserializedUser; } // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer // otherwise deserializing throws JsonMappingException?? @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt); } public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { SimpleModule module = new SimpleModule(); module.setDeserializerModifier(new BeanDeserializerModifier() { @Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { if (beanDesc.getBeanClass() == User.class) return new UserEventDeserializer(deserializer); return deserializer; } }); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(module); User user = mapper.readValue(new File("test.json"), User.class); } }
이 모듈을 ObjectMapper에 등록하면 User 클래스에 대한 사용자 정의 역직렬화가 활성화되어 기본 클래스에 대한 액세스가 허용됩니다. 사용자 지정 논리를 적용하기 전에 개체를 미리 채우기 위한 역직렬 변환기입니다.
위 내용은 사용자 정의 Jackson Deserializer 내에서 기본 Deserializer에 어떻게 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!