이 콩 ‘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 : 첫 번째