Jackson의 사용자 지정 JSON 역 직렬화, invalide 배열 제외

알렉스 마카로프

JSON으로 데이터를받습니다.

{
"status": "INVALID_DATA",
"errors":{ "invalid_id": "Id isn't available",
           ...
           "wrong_address": "Address error msg"
         }
}

구조 "오류"의 키와 수량은 알 수 없습니다. 나는 이것을 클래스와 매핑하려고합니다.

@JsonIgnoreProperties(ignoreUnknown = true)
public class StatusErrors
{
    private String status;
    private HashMap<String, String> errors = new HashMap<String, String>();

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public HashMap<String, String> getErrors() {
        return errors;
    }

    public void setErrors(HashMap<String, String> errors) {
        this.errors = errors;
    }
}

"오류"가 있으면 제대로 작동하지만 서버가 "OK"라고 말하고 오류가 없으면 나에게 보냅니다.

{
"status": "OK",
"errors":[]
}

(누가 서버를 작성하는지 묻지 마십시오) 매퍼가 충돌합니다. 사용자 지정 JsonDeserializer (일반적인 방법)를 작성하려고합니다.

public abstract class ExcludeEmptyArrayDeserializer<T> extends JsonDeserializer<T> {

    private final Class<T> clazz;

    protected ExcludeEmptyArrayDeserializer(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);

        if(node.has("errors")) {
            if (node.get("errors").isArray() && !node.get("errors").getElements().hasNext())
                ((ObjectNode)node).remove("errors");
        }

        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(node, clazz);   // doesn't work
        //return oc.treeToValue(node, clazz);   // doesn't work too
    }
}

public class StatusErrorsDeserializer extends ExcludeEmptyArrayDeserializer<StatusErrors> {
    public StatusErrorsDeserializer() {
        super(StatusErrors.class);
    }
}

결과 사용 코드에는보기가 있습니다.

    SimpleModule module = new SimpleModule("", Version.unknownVersion());
    module.addDeserializer(StatusErrors.class, new StatusErrorsDeserializer());

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY).withModule(module); 
    MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter();
    messageConverter.setObjectMapper(mapper);

    getRestTemplate().getMessageConverters().clear();
    getRestTemplate().getMessageConverters().add(messageConverter);

"오류"노드가 올바르게 삭제되었지만이 솔루션은 여전히 ​​작동하지 않습니다. JsonDeserializer.deserialize 메서드에서 실수를했지만 아이디어를 얻지 못했다고 가정합니다.

BTW StatusErrors 클래스는 서버의 다른 복잡한 메시지에 대한 기본 클래스가 될 수 있습니다.

일리아 오베 노프

가장 쉬운 해결책은 오류 변수 선언을 Object로 변경하는 것입니다.

@JsonIgnoreProperties(ignoreUnknown = true)
class StatusErrors {
    private String status;
    private Object errors;
    public Map<String, String> getErrorsMap() {
        if (this.errors instanceof Map) {
            return (Map)this.errors;
        }
        return null;
    }
....

serializer 및 deserializer가 필요하지 않습니다.

ObjectMapper objectMapper = new ObjectMapper();

StatusErrors result1 = objectMapper.readValue(JSON1, StatusErrors.class);
System.out.println(result1);
System.out.println(result1.getErrors().getClass());
System.out.println(result1.getErrorsMap());
StatusErrors result2 = objectMapper.readValue(JSON2, StatusErrors.class);
System.out.println(result2);

위 코드는 다음을 인쇄합니다.

StatusErrors(status=INVALID_DATA, errors={invalid_id=Id isn't available, wrong_address=Address error msg})
class java.util.LinkedHashMap
{invalid_id=Id isn't available, wrong_address=Address error msg}
StatusErrors(status=OK, errors=[])

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

분류에서Dev

Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

배열의 JSON 배열 역 직렬화

분류에서Dev

System.Text.Json 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

Rust : JSON 배열을 매우 간단한 사용자 정의 테이블로 역 직렬화

분류에서Dev

GSON을 사용하여 객체의 JSON 배열 역 직렬화

분류에서Dev

JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

분류에서Dev

Jackson JSON이 사용자 지정 루트 이름으로 요소 배열을 역 직렬화 할 수 없습니까?

분류에서Dev

Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

분류에서Dev

Jackson을 사용하여 JSON 배열을 매핑으로 역 직렬화

분류에서Dev

GSON을 사용하여 열거 형의 사용자 지정 역 직렬화

분류에서Dev

특정 필드가있는 경우에만 사용자 지정 JSON 역 직렬화 (Jackson 사용)

분류에서Dev

역 직렬화시 Jackson JSON 예외

분류에서Dev

Jackson을 사용하여 임의의 JSON 역 직렬화

분류에서Dev

잭슨 사용자 정의 직렬화 및 역 직렬화

분류에서Dev

배열 JSON 역 직렬화

분류에서Dev

Jackson을 사용한 JSON 파일의 다형성 역 직렬화

분류에서Dev

JSON을 변경하지 않고 JSON 배열의 NewtonSoft Inheretance 역 직렬화

분류에서Dev

기본 배열에 대한 사용자 지정 Gson 역 직렬화

분류에서Dev

System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

분류에서Dev

Circe의 수동 디코더를 사용하여 고정되지 않은 json 배열을 어떻게 역 직렬화 할 수 있습니까?

분류에서Dev

중복을 제거하지 않습니다 잭슨과 스프링을 사용하여 Java LinkedHashSet의에 자바 스크립트 배열의 역 직렬화

분류에서Dev

Jackson은 json 문자열을 역 직렬화하지만 bean에는 json 문자열의 속성 / 키가 없습니다.

분류에서Dev

Jackson : 문자열 배열을 List <T>로 역 직렬화

분류에서Dev

Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

분류에서Dev

Gson을 사용하여 매핑 할 json 배열 역 직렬화

분류에서Dev

튜플의 JSON 역 직렬화 문제?

분류에서Dev

Django 사용자 지정 역 직렬화

분류에서Dev

System.Text.Json을 사용한 사용자 지정 역 직렬화

Related 관련 기사

  1. 1

    Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

  2. 2

    Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

  3. 3

    배열의 JSON 배열 역 직렬화

  4. 4

    System.Text.Json 사용자 지정 직렬화 / 역 직렬화

  5. 5

    Rust : JSON 배열을 매우 간단한 사용자 정의 테이블로 역 직렬화

  6. 6

    GSON을 사용하여 객체의 JSON 배열 역 직렬화

  7. 7

    JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

  8. 8

    Jackson JSON이 사용자 지정 루트 이름으로 요소 배열을 역 직렬화 할 수 없습니까?

  9. 9

    Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

  10. 10

    Jackson을 사용하여 JSON 배열을 매핑으로 역 직렬화

  11. 11

    GSON을 사용하여 열거 형의 사용자 지정 역 직렬화

  12. 12

    특정 필드가있는 경우에만 사용자 지정 JSON 역 직렬화 (Jackson 사용)

  13. 13

    역 직렬화시 Jackson JSON 예외

  14. 14

    Jackson을 사용하여 임의의 JSON 역 직렬화

  15. 15

    잭슨 사용자 정의 직렬화 및 역 직렬화

  16. 16

    배열 JSON 역 직렬화

  17. 17

    Jackson을 사용한 JSON 파일의 다형성 역 직렬화

  18. 18

    JSON을 변경하지 않고 JSON 배열의 NewtonSoft Inheretance 역 직렬화

  19. 19

    기본 배열에 대한 사용자 지정 Gson 역 직렬화

  20. 20

    System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

  21. 21

    Circe의 수동 디코더를 사용하여 고정되지 않은 json 배열을 어떻게 역 직렬화 할 수 있습니까?

  22. 22

    중복을 제거하지 않습니다 잭슨과 스프링을 사용하여 Java LinkedHashSet의에 자바 스크립트 배열의 역 직렬화

  23. 23

    Jackson은 json 문자열을 역 직렬화하지만 bean에는 json 문자열의 속성 / 키가 없습니다.

  24. 24

    Jackson : 문자열 배열을 List <T>로 역 직렬화

  25. 25

    Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

  26. 26

    Gson을 사용하여 매핑 할 json 배열 역 직렬화

  27. 27

    튜플의 JSON 역 직렬화 문제?

  28. 28

    Django 사용자 지정 역 직렬화

  29. 29

    System.Text.Json을 사용한 사용자 지정 역 직렬화

뜨겁다태그

보관