@JsonProperty 속성은 언제 사용되며 어떤 용도로 사용됩니까?
이 콩의 '상태':
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
는 ajax 'success' 콜백을 사용하여 회선을 통해 전송됩니다.
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(이름)는 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 메서드를 지정하는 데도 사용됩니다.예를 들어 다음과 같은 payload가 있다고 가정합니다.
{
"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"이 아닙니다.이는 Java Beans 사양에 따라 "isXxx" 및 "setXxx" 형식의 메서드는 관리하는 논리 속성 "xxx"가 있음을 의미하기 때문입니다.
아시다시피, 이 모든 것은 물체를 연속화하고 담수화 하는 것입니다.오브젝트가 있다고 가정합니다.
public class Parameter {
public String _name;
public String _value;
}
이 오브젝트의 시리얼화는 다음과 같습니다.
{
"_name": "...",
"_value": "..."
}
변수 이름은 데이터를 직렬화하는 데 직접 사용됩니다.시스템 구현에서 system api를 삭제하려는 경우 serialization/deserialization 변수 이름을 변경해야 합니다.@JsonProperty는 serializer에게 serial object에 대한 방법을 알려주는 메타 데이터입니다.사용처:
- 변수명
- 액세스(읽기, 쓰기)
- 디폴트값
- 필수/옵션
예:
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 개체에서 사용됩니다.
위의 모든 답변과 더불어 문서에는 다음과 같은 내용이 기재되어 있습니다.
비정적 메서드를 논리 속성(시그니처에 따라 다름)의 "setter" 또는 "getter"로 정의하거나 논리 속성(시리얼화, 역직렬화)으로 사용할 비정적 객체 필드를 정의하는 데 사용할 수 있는 마커 주석입니다.
를 가지고 있는 경우non-static
당신의 수업에서 틀에 박히지 않은 방법getter or setter
그런 식으로 행동할 수 있습니다.getter and setter
주석을 사용하여 표시합니다.아래의 예를 참조해 주세요.
public class Testing {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getIdAndUsername() {
return id + "." + username;
}
public String concatenateIdAndUsername() {
return id + "." + username;
}
}
위의 오브젝트가 시리얼화되면 응답에는 다음이 포함됩니다.
- 사용자 이름
getUsername()
- 에서 식별하다.
getId()
- idAndUsername에서
getIdAndUsername
*
그 방법 이후getIdAndUsername
로부터 시작하다get
정상적인 게터로서 취급됩니다.그러면 왜 그런 주석을 붙일 수 있는지@JsonIgnore
.
다음 사항을 알아차린 경우concatenateIdAndUsername
이름이 로 시작하지 않기 때문에 반환되지 않습니다.get
그리고 만약 당신이 그 방법의 결과를 응답에 포함시키고 싶다면, 당신은 다음을 사용할 수 있습니다.@JsonProperty("...")
그리고 그것은 정상으로 취급될 것이다.getter/setter
위의 강조 표시된 문서에서 설명한 바와 같이.
다른 답변과 더불어@JsonProperty
주석을 사용하는 것은 매우 중요합니다.@JsonCreator
클래스 내의 주석에는 no-time 컨스트럭터가 없습니다.
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
따라서 잭슨은 이 컨스트럭터를 사용하여 인스턴스를 만듭니다.그러나 출력은 다음과 같습니다.
시리얼화: {"stringValue"}:ABCD", myEnum":첫 번째"}
"main" 스레드 com.fasterxml.jackson.databind.exc에 예외가 있습니다.Invalid Format Exception:문자열 값 'stringValue'에서 ClassToSerialize$MyEnum 인스턴스를 생성할 수 없습니다. 값은 선언된 Enum 인스턴스 이름 중 하나가 아닙니다. [FIRST, Second, Third]
단, 추가 후@JsonProperty
주석 생성자 주석:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
역직렬화는 성공했습니다.
시리얼화: {"myEnum"}:FIRST","stringValue":ABCD"}
String Value : ABCD
MyEnum: 최초
Json Property javadoc에서
논리 속성의 이름, 즉 속성에 사용할 JSON 개체 필드 이름을 정의합니다.값이 빈 String(기본값)인 경우 는 주석이 달린 필드의 이름을 사용하려고 합니다.
언급URL : https://stackoverflow.com/questions/12583638/when-is-the-jsonproperty-property-used-and-what-is-it-used-for
'programing' 카테고리의 다른 글
getchar()는 입력 문자열과 동일한 출력을 제공합니다. (0) | 2022.07.30 |
---|---|
Log4j 로거 프로그래밍 설정 (0) | 2022.07.30 |
Vue.js에서 속성과 메서드를 재정의하는 적절한 방법? (0) | 2022.07.30 |
Vue/Vuex - 모듈2는 모듈1에 의존하며 모듈1은 서버로부터 데이터를 취득합니다. (0) | 2022.07.28 |
g++ 링커: 정적 라이브러리가 있는 경우 정적 링크를 강제로 적용하시겠습니까? (0) | 2022.07.28 |