gpt4 book ai didi

java - 序列化:忽略一个包含空值的元素的列表属性

转载 作者:行者123 更新时间:2023-11-30 05:56:18 25 4
gpt4 key购买 nike

我正在使用 mongoDB 开发 java play Framework 2.6 Web 应用程序。让我们考虑一下这个模型结构:

public class Beneficiary {  
private Type type; // enum: NGO, PUBLIC_ADMINISTRATION ..
private Company company;
}
public class Company {
private String name;
private String registrationNumber;
private List<Person> agent;
}
public class Person {
private String name;
private String email;
private String phoneNumber;
}

我从表单收到此数据:

{
"type" : "NGO",
"company" : {
"name" : "ngo name",
"registrationNumber" : "2233",
"agent" : [
{
"name" : "",
"email" : "",
"phoneNumber" : ""
}
]
}
}

我不想在数据库中存储字段 agent以这种形式。如果元素的所有字段都是空字符串,我想完全忽略它。

我尝试使用 @JsonInclude(JsonInclude.Include.NON_EMPTY) 进行注释类和/或字段,但这仅适用于该字段 typeBeneficiary类。

有没有办法在不编写自定义注释的情况下做到这一点?

谢谢

最佳答案

您使用哪个 JSON 序列化库? jackson 还是 Gson ?

两者都支持定义您自己的自定义序列化器。

你可以为Person类型定义一个序列化器,然后当它遇到Person数据时,它会调用你的代码来序列化JSON,如果所有字段都为空,你可以忽略。

献给 jackson

public class PersonSerializer extends StdSerializer<Person> {

public PersonoSerializer() {
this(null);
}

public PersonSerializer(Class<Person> t) {
super(t);
}

@Override
public void serialize(
Item value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
if(value.name.isEmpty() && value.email.isEmpty() && value.phoneNumber.isEmpty()) return;

jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeStringField("itemName", value.itemName);
jgen.writeNumberField("owner", value.owner.id);
jgen.writeEndObject();
}

}

并在您的 Person 类上添加此注释

@JsonSerialize(using = PersonSerializer.class)
Person {
.....
}

关于java - 序列化:忽略一个包含空值的元素的列表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com