2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JsonNaming,JsonProperty,JsonIgnoreを一緒に使ったらどうなるのか試してみた

Last updated at Posted at 2022-02-10

はじめに

Spring BootでREST APIを作成しているときに、@JsonPropertyを一つ一つの変数に付けていた。
@JsonPropertyは、JavaオブジェクトからJSONへ変換した際に、JSONのプロパティ名を@JsonPropertyで指定したものに変更できるアノテーションである。
今回は、すべての変数をキャメルケースからスネークケースに変換するために使用していた。
この場合、クラスに@JsonNamingを指定するだけでも同様の結果が得られるため、このアノテーションを使用することにした。
変換するクラスの中には、変数名とは異なるプロパティ名にしたいものや、JSON変換から除外したいものがあるクラスもあったため、@JsonNaming,@JsonProperty,@JsonIgnoreを一緒に使用した場合についての挙動を念のため確認してみた。
予想では@JsonNamingより@JsonProperty,@JsonIgnoreの方が優先されすはず...

サンプルコード

依存関係に必要なもの

サンプル作成時の最新のものを使用しています。

pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>

JSONオブジェクトクラス

MyObject.java
package test;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import lombok.Data;

@Data
// キャメルケースからスネークケースへ
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class MyObject {

	private String userId;

	@JsonProperty("userrrName") // プロパティ名を個別指定
	private String userName;

	@JsonIgnore // JSONに変換しない
	private int age;

}

@JsonNamingで変換方法の指定方法でJackson 2.12からPropertyNamingStrategyが非推奨になっているため、PropertyNamingStrategiesで指定する必要がある。
@JsonNamingの使用方法を紹介した記事でPropertyNamingStrategyが使用されているものもあったので、最新のものを使用する場合は注意が必要。

メインクラス

JsonEncodeTest.java
package test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JsonEncodeTest {

	public static void main(String[] args) throws JsonProcessingException {

		MyObject myObject = new MyObject();
		myObject.setUserId("ID123456");
		myObject.setUserName("ユーザー名");
		myObject.setAge(20);

        // 整形出力するためSerializationFeature.INDENT_OUTPUTを指定
		ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
		String json = mapper.writeValueAsString(myObject);

		System.out.println(json);
	}

}

実行結果

{
  "user_id" : "ID123456",
  "userrrName" : "ユーザー名"
}

予想通りの結果になりました!
もしかしたらと思い確認しましたが予想通りでよかったです。

参考資料

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?