[java] @JsonProperty 속성은 언제 사용되며 어떤 용도로 사용됩니까?

이 콩 ‘State’:

public class State {

    private boolean isSet;

    @JsonProperty("isSet")
    public boolean isSet() {
        return isSet;
    }

    @JsonProperty("isSet")
    public void setSet(boolean isSet) {
        this.isSet = isSet;
    }

}

아약스 ‘성공’콜백을 사용하여 유선으로 전송됩니다.

        success : function(response) {
            if(response.State.isSet){
                alert('success called successfully)
            }

여기에 @JsonProperty 주석이 필요합니까? 그것을 사용하면 어떤 이점이 있습니까? 부작용 없이이 주석을 제거 할 수 있다고 생각합니다.

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations 에서이 주석에 대해 읽으면 언제 사용해야하는지 모르겠습니까?



답변

좋은 예가 있습니다. JSON이 .Net속성이 대문자로 시작 하는 환경에서 나오기 때문에 변수 이름을 바꾸는 데 사용합니다 .

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value;
}

이것은 JSON과 올바르게 구문 분석합니다.

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}


답변

OldCurmudgeon과 StaxMan이 둘 다 맞다고 생각하지만 여기에 간단한 예제가있는 한 문장의 대답이 있습니다.

@JsonProperty (name)은 Jackson ObjectMapper에게 JSON 특성 이름을 주석이 달린 Java 필드 이름에 맵핑하도록 지시합니다.

//example of json that is submitted 
"Car":{
  "Type":"Ferrari",
}

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }


답변

JsonProperty는 일반적인 직렬화 및 역 직렬화와는 별도로 변수에 대한 getter 및 setter 메소드를 지정하는데도 사용됩니다. 예를 들어 다음과 같은 페이로드가 있다고 가정하십시오.

{
  "check": true
}

그리고 Deserializer 클래스 :

public class Check {

  @JsonProperty("check")    // It is needed else Jackson will look got getCheck method and will fail
  private Boolean check;

  public Boolean isCheck() {
     return check;
  }
}

그런 다음이 경우 JsonProperty 주석이 필요합니다. 그러나 클래스에 메소드가있는 경우

public class Check {

  //@JsonProperty("check")    Not needed anymore
  private Boolean check;

  public Boolean getCheck() {
     return check;
  }
}

이 문서도 살펴보십시오 :
http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html


답변

주석이 없으면 유추 된 속성 이름 (JSON과 일치)이 의도 된 것처럼 “isSet”이 아닌 “set”이됩니다. Java Beans 스펙에 따라 “isXxx”및 “setXxx”형식의 메소드는 관리 할 논리적 특성 “xxx”가 있음을 의미하기 때문입니다.


답변

아시다시피, 이것은 객체를 직렬화하고 desalinize하는 것입니다. 객체가 있다고 가정하십시오.

public class Parameter {
  public String _name;
  public String _value;
}

이 객체의 직렬화는 다음과 같습니다.

{
  "_name": "...",
  "_value": "..."
}

변수 이름은 데이터를 직렬화하는 데 직접 사용됩니다. 시스템 구현에서 시스템 API를 제거하려는 경우 직렬화 / 직렬화에서 변수의 이름을 바꿔야하는 경우가 있습니다. @JsonProperty는 serializer에게 객체를 직렬화하는 방법을 알려주는 메타 데이터입니다. 다음과 같은 용도로 사용됩니다.

  • 변수 이름
  • 액세스 (읽기, 쓰기)
  • 기본값
  • 필수 / 선택

예에서 :

public class Parameter {
  @JsonProperty(
        value="Name",
        required=true,
        defaultValue="No name",
        access= Access.READ_WRITE)
  public String _name;
  @JsonProperty(
        value="Value",
        required=true,
        defaultValue="Empty",
        access= Access.READ_WRITE)
  public String _value;
}


답변

JsonProperty를 추가하면 누군가가 문제의 클래스가 Json 객체로 직렬화된다는 것을 깨닫지 못하는 속성 이름 중 하나를 변경하기로 결정한 경우 안전을 보장합니다. 속성 이름을 변경하면 JsonProperty가 속성 이름이 아닌 Json 객체에서 사용되도록합니다.


답변

다른 답변 외에도 인수가없는 생성자가없는 클래스 @JsonProperty에서 @JsonCreator주석 을 사용하는 경우 주석이 실제로 중요합니다 .

public class ClassToSerialize {

    public enum MyEnum {
        FIRST,SECOND,THIRD
    }

    public String stringValue = "ABCD";
    public MyEnum myEnum;


    @JsonCreator
    public ClassToSerialize(MyEnum myEnum) {
        this.myEnum = myEnum;
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
        String jsonString = mapper.writeValueAsString(classToSerialize);
        System.out.println(jsonString);
        ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
        System.out.println("StringValue: " + deserialized.stringValue);
        System.out.println("MyEnum: " + deserialized.myEnum);
    }
}

이 예제에서 유일한 생성자는로 표시 @JsonCreator되므로 Jackson은이 생성자를 사용하여 인스턴스를 만듭니다. 그러나 결과는 다음과 같습니다.

일련 번호 : { “stringValue”: “ABCD”, “myEnum”: “FIRST”}

스레드 “main”com.fasterxml.jackson.databind.exc.InvalidFormatException 예외 : 문자열 값 ‘stringValue’에서 ClassToSerialize $ MyEnum 인스턴스를 생성 할 수 없습니다
. 선언 된 Enum 인스턴스 이름 중 하나가 아닌 값 : [FIRST, SECOND, THIRD]

그러나 @JsonProperty생성자에 주석을 추가 한 후 :

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}

역 직렬화가 완료되었습니다.

일련 번호 : { “myEnum”: “FIRST”, “stringValue”: “ABCD”}

StringValue : ABCD

MyEnum : 첫 번째