복붙노트

[SPRING] jackson JSON 라이브러리의 ALLOW_UNQUOTED_FIELD_NAMES

SPRING

jackson JSON 라이브러리의 ALLOW_UNQUOTED_FIELD_NAMES

JSON에서 직렬화 / 역 직렬화하기 위해 잭슨 라이브러리를 사용하고 있습니다. 나는이 JSON이 가능한 한 가장 작은 크기를 가질 필요가 있기 때문에 ALLOW_UNQUOTED_FIELD_NAMES 기능을 사용하여 모든 따옴표를 제거했습니다. 따옴표를 지우는 것이 표준 json이 아니라는 것을 알고 있지만 json을 작게 만드는 것은 프로젝트의 어려운 요구 사항입니다. 생성 된 json은 작동하지만 json 값을 읽으려고하면 예외가 발생합니다.

위의 예외는이 json을 읽을 때 발생합니다.

{90110a2e-febd-470f-afa4-cf7e890d31b9:0,eec652ad-a4d9-4eb1-8d24-7c1a0c29449f:1}

내가 읽는 방법은 :

Map<String, Object> valuesMap = oM.readValue(json, new TypeReference<Map<String, Object>>() {});

그리고 값을 읽고 쓰는 데 사용하는 객체 매퍼는 다음과 같습니다.

private static final ObjectMapper om = new ObjectMapper();
static {
    om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
    om.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    om.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
    om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    om.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}

나는 발신자와 수신자 프로젝트 모두에서 Jackson의 1.6.3 버전을 사용하고 있습니다. 이 기능에 필요한 버전은 1.2+입니다. 그래서이 버전을 사용하지 않고 아마도 리시버가 Spring 어플리케이션이고 libs 폴더에 설치된 라이브러리가 1.6.3인지 확인했습니다.

무엇을 잘못하고있을 수 있습니까? 지도와 함께이 기능을 사용할 수없는 경우 일 수 있습니다.

다른 질문이 있습니다. 지금까지는 키가 단지 uuid 값이고 값이 숫자 인지도를 보내고 있습니다. ALLOW_UNQUOTED_FIELD_NAMES 기능이있는 특수 문자로 값을 보내면 문제가 생길 수 있습니까? 잭슨이이 캐릭터를 피할 것입니까?

감사.

해결법

  1. ==============================

    1.어떤 경우에는 QUOTE_FIELD_NAMES가있는 Jackson과 같아서 ALLOW_UNQUOTED_FIELD_NAMES를 on으로 설정해도 읽을 수없는 출력을 생성합니다. 비표준 입력 파싱을 위해 사용자 정의 JsonParser를 구현해야 할 것입니다.

    어떤 경우에는 QUOTE_FIELD_NAMES가있는 Jackson과 같아서 ALLOW_UNQUOTED_FIELD_NAMES를 on으로 설정해도 읽을 수없는 출력을 생성합니다. 비표준 입력 파싱을 위해 사용자 정의 JsonParser를 구현해야 할 것입니다.

    문제는 비표준 JSON을 생성하고 있으며 클라이언트가이를 제대로 처리한다는 보장이 없다는 것입니다. 그러나 응용 프로그램 외부에 노출시키지 않고 크기에 대해 신경 쓰지 않으면 Jackson 's Smile과 같은 바이너리 형식을 구문 분석 / 생성 할 수 있습니다. http://www.cowtowncoder.com/blog/archives/2010/09/entry_418.html (2.4)을 참조하십시오.

  2. ==============================

    2.좋습니다, Pingw33n의 대답은 제 생각에 꽤 정확합니다. 그래서 : 예, 당신은 그 기능을 사용할 수 있습니다; 따옴표가없는 이름이 어떻게 작동해야하는지에 대한 사양이 없기 때문에 (오히려 JSON은 이름에 대해 모든 문자를 허용합니다!) 오히려 경험적입니다. 또는 어떤 탈출 메커니즘이 사용된다면 누가 무엇을 쓰거나 받아 들여야하는지에 대한 추측을 갖습니다.

    좋습니다, Pingw33n의 대답은 제 생각에 꽤 정확합니다. 그래서 : 예, 당신은 그 기능을 사용할 수 있습니다; 따옴표가없는 이름이 어떻게 작동해야하는지에 대한 사양이 없기 때문에 (오히려 JSON은 이름에 대해 모든 문자를 허용합니다!) 오히려 경험적입니다. 또는 어떤 탈출 메커니즘이 사용된다면 누가 무엇을 쓰거나 받아 들여야하는지에 대한 추측을 갖습니다.

    이 특별한 경우에는 문제가되는 '-'문자 일 것입니다. 잭슨이 사용하는 근사치 인 Javascript 이름의 합법적 인 부분이 아닙니다.

    한 가지 가능한 해결책은 Jackson이 속성 이름에서 이러한 문자를 이스케이프 처리하는 것입니다 (현재 어떻게 수행되는지 기억하지 못합니다. 이름 문자가 인용 된 경우). 간단한 테스트 케이스를 이해할 수 있다면 Jackson Jira의 Jira request-for-enchancement를 추가하여 탈출을 시도 할 수 있습니다 (파서가 평범한 백 슬래시 버전을 이스케이프 할 수 있음).

  3. ==============================

    3.문제는 Javascript 구문과 관련이 있으며 Jackson이나 JSON과 관련이 없다고 생각합니다.

    문제는 Javascript 구문과 관련이 있으며 Jackson이나 JSON과 관련이 없다고 생각합니다.

    Javascript에서 이름은 선택적으로 하나 이상의 문자, 숫자 또는 밑줄이 뒤에 오는 문자이므로 90110a2e-febd-470f-afa4-cf7e890d31b9는 유효한 Javascript 이름이 아닙니다.

    이름이 유효한 JavaScript 이름이고 예약어가 아닌 경우 속성 이름 주위의 따옴표는 선택 사항입니다. 따옴표는 "이름"주위에 필요하지만 first_name 주위에서는 선택 사항입니다.

    BTW, JSON 크기에 대해 그렇게 염려한다면 왜 gzip을 사용하지 않는 것이 좋을까요?

  4. from https://stackoverflow.com/questions/4815231/allow-unquoted-field-names-in-jackon-json-library by cc-by-sa and MIT license