技術共有

SpringBoot アノテーション--11--@JSONField @JsonProperty

2024-07-12

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

ヒント: 記事を作成した後、目次を自動的に生成することができます。生成方法については、右側のヘルプ ドキュメントを参照してください。


質問: バックエンド エンティティ クラスの 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. アノテーションの違い

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 アノテーションは使用できません。

@Jsonプロパティ

新品を使用している場合スプリングブートプロジェクト、デフォルトはジャクソンシリアル化です。プロパティに直接アノテーションを使用してください。

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 文字列に変換します。
  • ObjectMapper().readValue(string) メソッドとともに使用して、JSON 文字列をエンティティ クラスに変換します。

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 文字列に変換するために JSON.toJSONString (エンティティ クラス) メソッドとともに使用されます。
  • 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.フォーマット属性

format 属性を使用すると、日付型属性の形式と、数値型を文字列型に変換する形式を指定できます。

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

上記の例では、@JSONField アノテーションを使用して userId 属性がシリアル化から除外されます。

5.デシリアライズ属性

  • 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

上記の例では、@JSONField アノテーションを使用して、age プロパティが逆シリアル化から除外されています。

6.順序属性

属性の順序は、ordinal 属性を通じて指定できます。

  • デフォルトでは、プロパティの順序は、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. type 属性

  • 属性のタイプは type 属性で指定できます。
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

上記の例では、@JSONField アノテーションを使用して、age 属性の型を文字列型として指定しています。