java - 忽略基于另一个字段值的序列化字段
问题描述
我有这样的课:
public class Profile {
private String firstName;
private String lastName;
private String nickName;
@JsonIgnore
private boolean isNameSecret;
}
序列化对象时可以隐藏属性firstName
,lastName
如果isNameSecret
值为true
?
解决方案
您需要编写自定义序列化程序并实现该逻辑。它可能如下所示:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class ProfileApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
System.out.println(mapper.writeValueAsString(new Profile()));
}
}
class ProfileJsonSerialize extends JsonSerializer<Profile> {
@Override
public void serialize(Profile profile, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
if (!profile.isNameSecret()) {
gen.writeStringField("firstName", profile.getFirstName());
gen.writeStringField("lastName", profile.getLastName());
}
gen.writeStringField("nickName", profile.getNickName());
gen.writeEndObject();
}
}
@JsonSerialize(using = ProfileJsonSerialize.class)
class Profile {
private String firstName = "Rick";
private String lastName = "Sanchez";
private String nickName = "Pickle Rick";
private boolean isNameSecret = true;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public boolean isNameSecret() {
return isNameSecret;
}
public void setNameSecret(boolean nameSecret) {
isNameSecret = nameSecret;
}
}
上面的代码打印:
{
"nickName" : "Pickle Rick"
}
推荐阅读
- r - 使用胶合语法将多个数据变量隧道化以“汇总”
- javascript - Angular:ngmodel 在 HTML 中创建空白选择选项
- docker - docker build --no-cache 会构建不同的层吗?
- stl - 使用 LLVM 在 Windows 上使用 QtCreator 设置 Cocos2dx 项目
- c# - Azure Functions - Host.json 不适用于 Azure 应用程序设置
- android - 在多行 TextView 的末尾放置一个视图
- typo3 - TYPO3 使用 Querybuilder 更改表
- oracle - 在 Obiee12c 中创建一个新用户
- jasper-reports - 是否可以在主报告中包含子报告作为二进制文件的一部分?
- vb.net - VB.NET 2010 - 用于 FTPS 的 WinSCP 包