기술나눔

SpringBoot 주석--11--@JSONField @JsonProperty

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Tip: 글 작성 후 자동으로 목차가 생성될 수 있습니다. 생성 방법은 오른쪽 도움말 문서를 참고하세요.


질문: 백엔드 엔터티 클래스에서 isXXX로 시작하는 속성은 프런트엔드로 전달된 후 자동으로 제거됩니다.

여기에 이미지 설명을 삽입하세요.

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

해결책:

  1. 생성된 isReceipt() 메소드 이름을 getIsReceipt()로 변경합니다.
  2. 생성된 get 메서드, 즉 isReceipt에 @JsonProperty(value = “isXXX”) 주석을 추가합니다.
 @JsonProperty(value = "isReceipt")
    public boolean isReceipt() {
        return isReceipt;
    }
    @JsonProperty(value = "isExamine")
    public boolean isExamine() {
        return isExamine;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

여기에 이미지 설명을 삽입하세요.

@JsonProperty 및 @JSONField

1. 소개

  • @JsonProperty 및 @JSONField 주석은obj를 json 문자열로 변환할 때 java bean의 속성 이름을 대상 속성 이름으로 바꿉니다. . 이는 타사 인터페이스를 호출할 때 속성 이름이 일관되지 않는 시나리오에서 일반적입니다.
  • 두 주석의 기능은 동일하지만 소스가 다르고 사용되는 방식도 다릅니다. 유사점과 차이점은 아래에서 자세히 설명하겠습니다!

2. 주석의 차이점

2.1 기본 프레임워크가 다릅니다.

  • @JsonProperty는 Jackson에 의해 구현됩니다.
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField는 fastjson으로 구현됩니다.
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2 다양한 범위

@JSONproperty 주석은 다음 용도로 사용됩니다.속성~ 위에

  • trueName 속성을 name으로 직렬화하려면 속성 이름에 @JsonProperty(value="name")을 추가하면 됩니다.

@JSONField 주석을 사용할 수 있습니다.가져오기, 설정 및 속성~ 위에

  • trueName 속성을 name으로 직렬화하려면 get/set/property 이름에 @JSONField(value="name")을 추가하면 됩니다.

2.3 장점과 단점 비교

  1. @JSONField 주석은 사용이 더 간단합니다. 주석의 기본값은 속성 이름과 동일하지만 @JsonProperty에서는 속성 이름을 수동으로 지정해야 합니다.

  2. @JSONField 주석은 직렬화 중 날짜 형식, null 값 처리 방법 등과 같은 더 많은 속성 매핑 옵션을 지원합니다.

  3. fastjson 자체가 고성능 JSON 처리 라이브러리이므로 @JSONField 주석의 성능이 더 빠릅니다.

  4. Jackson 프레임워크를 사용하는 경우 @JsonProperty 주석만 사용할 수 있으며 @JSONField 주석은 사용할 수 없습니다.

@JsonProperty

새로운 것을 사용하는 경우스프링부트 프로젝트, 기본값은 Jackson 직렬화입니다. 속성에서 직접 주석을 사용하세요.

1. 의존성

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JsonProperty 주석은 jackson 패키지에서 제공되며 ObjectMapper().writeValueAsString(엔티티 클래스) 메서드와 함께 사용되어 엔터티 클래스를 json 문자열로 변환합니다.
  • JSON 문자열을 엔터티 클래스로 변환하기 위해 ObjectMapper().readValue(string) 메서드와 함께 사용됩니다.

2. json 문자열과 bean 객체 간의 변환을 테스트합니다.

엔터티 클래스: User.java

import com.fasterxml.jackson.annotation.JsonProperty;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JsonProperty("JsonPropertyName")
	private String name;
	private String sex;
	private Integer age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

테스트 방법:

@Test
public void testJsonProperty() throws IOException{
    //bean ---> json
	User user=new User("zhangsan","man",22);
	
	System.out.println(new ObjectMapper().writeValueAsString(user));
	

    //json ---> bean
	String str="{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}";
	
	System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

시험 결과:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Bean이 json 문자열로 변환된 후 @JsonProperty로 주석이 달린 Bean 속성 이름이 지정된 속성 이름인 JsonPropertyName으로 대체되었음을 알 수 있습니다.

  • json 문자열이 bean으로 변환된 후 @JsonProperty 주석으로 지정된 속성 이름은 bean 속성 이름으로 대체되었습니다: name;

@JSON필드

1. 의존성

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField는 fastjson 패키지에 있으며 JSON.toJSONString(엔티티 클래스) 메서드와 함께 사용되어 엔터티 클래스를 json 문자열로 변환합니다.
  • JSON.parseObject(string,entity class.class) 메서드와 함께 사용하여 json 문자열을 엔터티 클래스로 변환합니다.

2. json 문자열과 bean 객체 간의 변환을 테스트합니다.

엔터티 클래스: User.java

import com.alibaba.fastjson.annotation.JSONField;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JSONField(name="JSONFieldName")
	private String name;
	private String sex;
	private Integer age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

테스트 방법:

@Test
public void testSONField(){
    //bean ---> json
	User user=new User("zhangsan","man",22);
	System.out.println(JSON.toJSONString(user));
	
    //json ---> bean
	String str="{"JSONFieldName":"zhangsan","age":22,"sex":"man"}";
	System.out.println(JSON.parseObject(str, User.class).toString());	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

시험 결과:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Bean이 json 문자열로 변환된 후 @JSONField 주석의 Bean 속성 이름이 지정된 속성 이름인 JSONFieldName으로 대체되었음을 알 수 있습니다.
  2. json 문자열이 bean으로 변환된 후 @JSONField 주석으로 지정된 속성 이름은 bean 속성 이름으로 대체되었습니다: name;
  3. 테스트 결과는 @JsonProperty와 동일합니다.

3.형식 속성

형식 속성은 날짜 유형 속성의 형식과 숫자 유형을 문자열 유형으로 변환하는 형식을 지정하는 데 사용할 수 있습니다.

public class User {
    private String name;
    private int age;
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;
    @JSONField(format = "#,###.00")
    private double salary;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 위의 예에서 @JSONField 주석은 생일 속성의 날짜 형식을 "yyyy-MM-dd"로 지정하는 데 사용됩니다.
  • 급여 속성의 숫자 형식은 "#,###.00"입니다.

4. 속성 직렬화

  • serialize 속성을 통해 속성이 JSON 객체로 직렬화되는지 여부를 제어할 수 있습니다.
  • serialize 속성이 false이면 속성이 JSON 개체로 직렬화되지 않습니다. 기본값은 true입니다.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

위의 예에서 userId 속성은 @JSONField 주석을 사용하여 직렬화에서 제외됩니다.

5.deserialize 속성

  • deserialize 특성을 사용하여 JSON 객체의 속성이 Java 객체로 역직렬화되는지 여부를 제어할 수 있습니다.
  • deserialize 속성이 false이면 이 속성은 JSON 개체에서 Java 개체로 역직렬화되지 않습니다. 기본값은 true입니다.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

위의 예에서 age 속성은 @JSONField 주석을 사용하여 역직렬화에서 제외됩니다.

6.서수 속성

속성의 순서는 순서 속성을 통해 지정할 수 있습니다.

  • 기본적으로 속성의 순서는 속성이 Java 개체에 나타나는 순서를 기반으로 합니다.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

위의 예에서 @JSONField 주석은 age 속성의 순서가 1이고 name 속성의 순서가 2임을 지정하는 데 사용됩니다.

7.defaultValue 속성

defaultValue 속성은 Java 객체에서 속성의 기본값을 지정하는 데 사용될 수 있습니다.

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

위의 예에서 @JSONField 주석은 userId 속성의 기본값이 0이고 name 속성의 기본값이 "N/A"임을 지정하는 데 사용됩니다.

8. 유형 속성

  • 속성 유형은 유형 속성을 통해 지정할 수 있습니다.
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

위의 예에서는 @JSONField 주석을 사용하여 age 속성의 유형을 문자열 유형으로 지정합니다.