はじめに
Spring BootでREST APIを作成しているときに、@JsonProperty
を一つ一つの変数に付けていた。
@JsonProperty
は、JavaオブジェクトからJSONへ変換した際に、JSONのプロパティ名を@JsonProperty
で指定したものに変更できるアノテーションである。
今回は、すべての変数をキャメルケースからスネークケースに変換するために使用していた。
この場合、クラスに@JsonNaming
を指定するだけでも同様の結果が得られるため、このアノテーションを使用することにした。
変換するクラスの中には、変数名とは異なるプロパティ名にしたいものや、JSON変換から除外したいものがあるクラスもあったため、@JsonNaming
,@JsonProperty
,@JsonIgnore
を一緒に使用した場合についての挙動を念のため確認してみた。
予想では@JsonNaming
より@JsonProperty
,@JsonIgnore
の方が優先されすはず...
サンプルコード
依存関係に必要なもの
サンプル作成時の最新のものを使用しています。
<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オブジェクトクラス
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が使用されているものもあったので、最新のものを使用する場合は注意が必要。
メインクラス
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" : "ユーザー名"
}
予想通りの結果になりました!
もしかしたらと思い確認しましたが予想通りでよかったです。