programing

잭슨이 변수 이름의 대소문자를 변경하지 못하도록 합니다.

stoneblock 2023. 6. 23. 21:42

잭슨이 변수 이름의 대소문자를 변경하지 못하도록 합니다.

저는 봄에 잭슨을 이용하여 JSON에 제 수업을 연재하고 있습니다.아래 예시와 같은 클래스를 직렬화하면 잭슨은 특정 필드의 이름을 Camel Case에서 소문자로 변경하고 있습니다.사용자 지정(비) 직렬화 프로그램을 만들어 이 문제를 해결할 수 있다는 것을 알고 있지만, 이 기능을 전체적으로 해제하기를 희망합니다.application.properties에서 속성을 설정하면 됩니다.

기본 Jackson 명명 전략에 따라 이 작업은 수행되지 않습니다.

등록된 사용자 지정 전략이 없는 경우 기본 Java 속성 이름 지정 전략이 사용되며 필드 이름은 그대로 유지됩니다.

class Foo {
    private final String firstName;
    private final String aName;
    private final String name;
    private final String abName;

    Foo(final String firstName, final String aName, final String name, final String abName) {
        this.firstName = firstName;
        this.aName = aName;
        this.name = name;
        this.abName = abName;
    }
    // Getters here
}

public static void main(String[] args) {
        final ObjectMapper mapper = new ObjectMapper();
        final Foo foo  = new Foo("first", "a", "name", "ab");
        final String jsonInString = mapper.writeValueAsString(foo);
        System.out.println(jsonInString);
}

예상:

{"firstName":"first",name":"name",abName":"ab",aName":"a"}

실제:

{"firstName":"first",name":"name",abName":"ab",anname":"a"}

편집:

문제를 이해하는 사람들의 해석으로 좁혔습니다.잭슨의 벌레처럼 보이기 시작했습니다.

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    public String getaName() {
        return this.aName;
    }
}

일련 번호:{"aName":"a"}

하지만,

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    public String getAName() {
        return this.aName;
    }
}

일련 번호:{"aname":"a"}

여기서 문제는 JavaBeans(TM) 사양에 대한 것입니다.사양에 따라(58페이지)

그러나 모든 대문자 이름을 가끔 사용할 수 있도록 이름의 처음문자가 모두 대문자인지 확인하고 그대로 둡니다.

"FooBah"는 "FooBah"가 됩니다.

"Z"가 "z"가 됨

"URL"이 "URL"이 됩니다.

그리고 당신은 유리한 케이스를 가지고 있습니다.aName필드. 왜냐하면 만약 게터가 다음과 같이 보인다면.AName()그러면 당신이 이 게터에서 다시 변환할 때 당신은 찾아야 합니다.AName필드를 지정합니다.다음은 추가 정보 설명입니다.

그래서 이것을 고치기 위해, 당신은 적절한 getter를 사용할 수 있습니다.getaName()) 또는@JsonProperty("aName")필드 위의 주석

여기 비슷한 질문이 있습니다.

잭슨이 왜 책을 읽는지는 모르겠지만,getAName로.aname잭슨이 특정 이름을 사용하도록 강제할 수 있습니다.@JsonProperty("AName")예:

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    @JsonProperty("AName")
    public String getAName() {
        return this.aName;
    }
}

(이와 밀접하게 관련된 질문에서 이 솔루션을 얻었습니다.)

개체 맵에서 속성 명명 전략 옵션을 사용할 수도 있습니다.

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)

언급URL : https://stackoverflow.com/questions/46652019/stop-jackson-from-changing-case-of-variable-names