Jackson JSON
Spring は、Jackson JSON ライブラリのサポートを提供します。
JSON ビュー
Spring MVC は、Jackson の直列化ビュー (英語) の組み込みサポートを提供します。これにより、Object
内のすべてのフィールドのサブセットのみをレンダリングできます。@ResponseBody
または ResponseEntity
コントローラーメソッドで使用するには、次の例に示すように、Jackson の @JsonView
アノテーションを使用して直列化ビュークラスをアクティブ化できます。
Java
Kotlin
@RestController
public class UserController {
@GetMapping("/user")
@JsonView(User.WithoutPasswordView.class)
public User getUser() {
return new User("eric", "7!jd#h23");
}
}
public class User {
public interface WithoutPasswordView {};
public interface WithPasswordView extends WithoutPasswordView {};
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@JsonView(WithoutPasswordView.class)
public String getUsername() {
return this.username;
}
@JsonView(WithPasswordView.class)
public String getPassword() {
return this.password;
}
}
@RestController
class UserController {
@GetMapping("/user")
@JsonView(User.WithoutPasswordView::class)
fun getUser() = User("eric", "7!jd#h23")
}
class User(
@JsonView(WithoutPasswordView::class) val username: String,
@JsonView(WithPasswordView::class) val password: String) {
interface WithoutPasswordView
interface WithPasswordView : WithoutPasswordView
}
@JsonView はビュークラスの配列を許可しますが、コントローラーメソッドごとに 1 つしか指定できません。複数のビューをアクティブにする必要がある場合は、複合インターフェースを使用できます。 |
@JsonView
アノテーションを宣言する代わりに、上記をプログラムで実行する場合は、戻り値を MappingJacksonValue
でラップし、それを使用して直列化ビューを提供します。
Java
Kotlin
@RestController
public class UserController {
@GetMapping("/user")
public MappingJacksonValue getUser() {
User user = new User("eric", "7!jd#h23");
MappingJacksonValue value = new MappingJacksonValue(user);
value.setSerializationView(User.WithoutPasswordView.class);
return value;
}
}
@RestController
class UserController {
@GetMapping("/user")
fun getUser(): MappingJacksonValue {
val value = MappingJacksonValue(User("eric", "7!jd#h23"))
value.serializationView = User.WithoutPasswordView::class.java
return value
}
}
ビューリゾルバーに依存するコントローラーの場合、次の例に示すように、モデルに直列化ビュークラスを追加できます。
Java
Kotlin
@Controller
public class UserController extends AbstractController {
@GetMapping("/user")
public String getUser(Model model) {
model.addAttribute("user", new User("eric", "7!jd#h23"));
model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
return "userView";
}
}
@Controller
class UserController : AbstractController() {
@GetMapping("/user")
fun getUser(model: Model): String {
model["user"] = User("eric", "7!jd#h23")
model[JsonView::class.qualifiedName] = User.WithoutPasswordView::class.java
return "userView"
}
}