prosource

Jackson이 Getter를 @JsonProperty로 덮어쓰지 않음

probook 2023. 3. 9. 22:10
반응형

Jackson이 Getter를 @JsonProperty로 덮어쓰지 않음

JsonProperty잭슨이 getter에서 얻은 기본 이름을 덮어쓰는 것이 아닙니다.아래 클래스를 다음과 같이 연재하면ObjectMapper그리고 잭슨 나는 이해한다.

{"hi":"hello"}

보시다시피 JsonProperty 주석에는 영향이 없습니다.

class JacksonTester {
    String hi;

    @JsonProperty("hello")
    public String getHi() {
        return hi;
    }
}   

놓는 것@JsonPropertyString 자체도 작동하지 않습니다.이름을 변경할 수 있는 유일한 방법은 getter의 이름을 변경하는 것입니다. 유일한 문제는 getter가 항상 첫 글자의 소문자가 된다는 것입니다.

문제는 내가 예전과 새로운 잭슨 도서관을 모두 사용하고 있었다는 것이다.

다시 말해, 내가 하기 전에import org.codehaus.jackson.annotate.JsonProperty;내가 사용하던 도서관과 일관되게 하기 위해 아래와 같이 변경해야 했다.

내가 메이븐을 사용했기 때문에, 그것은 나의 메이븐 의존관계를 갱신하는 것을 의미했다. import com.fasterxml.jackson.annotation.JsonProperty;

이게 작동하려면@JsonPropertyGetter의 주석(개체에 주석을 달면 작동하지 않음)

여기에서 (francesco foresti 덕분에) @Json Property가 예상대로 작동하지 않습니다.

Kotlin을 사용하는 경우

원래 질문은 Java로 되어 있는 것은 알고 있습니다만, Kotlin이 매우 인기를 끌고 있어 많은 사람이 사용하고 있을 가능성이 있기 때문에, 다른 사람을 돕기 위해 여기에 투고하고 싶습니다.

어쨌든 Kotlin의 경우, Getters/Setters가 어떻게 동작하는지,val즉, 다음과 같이 게터에만 주석을 적용해야 할 수 있습니다.

class JacksonTester(@get:JsonProperty("hello") val hi: String)

오래된 질문인 건 알지만 Gson 라이브러리와 상충되는 것을 알고 사용할 수 밖에 없었습니다.@SerializedName("name")대신@JsonProperty("name")이것이 도움이 되기를 바란다

이전 버전에서 FasterXML Jackson 2.8.3으로 업데이트 할 때 문제가 있었습니다.

문제는 DB에서 Java 클래스 객체로 JSON 응답을 역직렬화할 때, 우리의 코드는@JsonSetter반의 셋터에서.따라서 시리얼화 시 출력은 Java 클래스 오브젝트를 JSON으로 시리얼화하기 위해 클래스의 getters를 사용하지 않았습니다(따라서@JsonProperty()데코레이터가 효력을 발휘하지 못했습니다.)

이 문제를 수정하기 위해@JsonSetter("name-from-db")해당 속성의 세터 메서드로 이동합니다.

그리고 그 대신@JsonProperty()getter 메서드를 사용하여 속성 이름을 변경하려면 , 를 사용합니다.@JsonGetter()속성 이름을 변경하는 데 더 구체적입니다.

델의 코드는 다음과 같습니다.

public class KwdGroup {
    private String kwdGroupType;

    // Return "type" instead of "kwd-group-type" in REST API response
    @JsonGetter("type") // Can use @JsonProperty("type") as well
    public String getKwdGroupType() {
        return kwdTypeMap.get(kwdGroupType);
    }

    @JsonSetter("kwd-group-type") // "kwd-group-type" is what JSON from the DB API outputs for code to consume 
    public void setKwdGroupType(String kwdGroupType) {
        this.kwdGroupType = kwdGroupType;
    }
}

나는 같은 프로플렘을 가졌다.

import com.fasterxml.jackson.annotation만 바꾸면 됩니다.JsonProperty.import org.codehouse.jackson.annotate.Json Property: 동작합니다.

나는 최근에 이 문제에 대해 또 다른 흥미로운 반전을 발견했다.Hibernate5 Module을 사용하여 로드 지연 문제를 해결했습니다.또한 Groovy를 사용하고 있기 때문에 getters와 setters를 정의하고 있지 않습니다.

이 Hibernate Module을 하는 것으로 .@JsonProperty주석입니다.특히 다음과 같은 주석을 달고 있는 경우@Transient예를 들어 다음과 같은 것이 있습니다.

@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property

보이실 거예요.alternateNameJSON에 있습니다.나에에가 POST PUT 에에에에 。이 문제를 해결하려면 간단한 회피책을 사용할 수 있습니다. 및 getters는 value으로 돌리다@JsonProperty 하면

@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName

void setProperty(String property) {
    this.alternateName = property
}

@JsonIgnore
String getProperty() {
    this.alternateName
}

「 」의 .@JsonIgnore않은 이 선택되고될 수 .그렇지 않으면 프레임워크에서 해당 항목이 선택되고 JSON에 동일한 항목이 중복될 수 있습니다.

어쨌든 - 나는 이것이 누군가에게 도움이 되기를 바란다!

(*)특정 인터페이스에 준거하여 내부적으로 이름을 적용하려고 했습니다.그러나 노출된 API에는 다른 사용자 친화적인 이름이 필요했습니다.

카멜 케이스는 적절한 주석을 정의한 후에도 여전히 문제가 있는 것으로 보입니다.예:

@JsonProperty("mirrorport") 프라이빗 문자열 mirrorPort;

에 xml이 있는 합니다.<mirrorport>YES</mirrorport>

데이터 바인딩 종속성이 누락되었습니다.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${fasterxml.version}</version>
</dependency>

getter가 아닌 변수에 배치

class JacksonTester {
    @JsonProperty("hello")
    private String hi;

    public String getHi() {
        return hi;
    }
} 

아래를 시도해 보셨습니까?

class JacksonTester {
    private String hi;

    @JsonProperty("hello")
    public String getHi() {
        return hi;
    }
}   

제 말은 'hi' 변수 선언을 비공개로 하는 것입니다.또는 변수 선언에 @JsonIgnore를 붙이거나 기본 범위로 유지하는 것을 권장합니다.

이거 드셔보세요

class JacksonTester {
    private String hi;

    @JsonProperty("hi")
    public String getHi() {
        return hi;
    }
} 

언급URL : https://stackoverflow.com/questions/32843099/jackson-not-overriding-getter-with-jsonproperty

반응형