3 回答

TA貢獻1784條經驗 獲得超7個贊
您使用的是哪個 JSON 序列化庫?杰克遜還是格森?
兩者都支持定義您自己的自定義序列化程序。
您可以為 Person 類型定義一個序列化器,然后它會在遇到 Person 數據時調用您的代碼來序列化 JSON,如果所有字段都為空,您可以忽略。
對于杰克遜
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 {
.....
}

TA貢獻1818條經驗 獲得超8個贊
像這樣使用 Morphia 提供的 @PreSave 注釋
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;
@PreSave
public void preSave(BSONObject dbObj) {
List<?> agents = (List<?>) dbObj.get("agents");
for (int i = 0; i < agents.size(); i++) {
if (Json.toJson(agents.get(i)).size() == 0) {
agents.remove(i);
}
}
if (agents.size() == 0) {
dbObj.removeField("agents");
}
....
}
}
public class Person {
private String name;
private String email;
private String phoneNumber;
@PreSave
public void preSave(BSONObject dbObj) {
if (dbObj.get("name") != null && dbObj.get("name").equals("")) {
dbObj.removeField("name");
}
....
}
}

TA貢獻1830條經驗 獲得超9個贊
還有更多選項,但我會編寫一些代碼來檢查這些字段是否為空字符串,如果是,則將“代理”設置為 null。
所以,假設你有類似的東西:
saveCompany(Company company) {
agent=company.getAgent();
if (StringUtils.isEmpty(agent.getName()) && StringUtils.isEmpty(agent.getEmail()) && StringUtils.isEmpty(agent.getPhoneNumber)) {
company.setAgent(null);
}
saveToMongo(company);
}
如果你有很多類似的情況,你也可以寫一些代碼通過反射來做到這一點。
if (allFieldsAreEmpty(company.getAgent())) {
company.setAgent(null);
}
順便說一下,你應該從表單接收的數據應該有點不同,
"agent": [
{
"name": "",
"email": "",
"phoneNumber": ""
}
]
另一個選項是在 Play 中設置,以便當用戶在表單中輸入空字符串時,接收 NULL 字符串而不是“”。盡管您最終仍會得到一個所有字段都設置為 null 的 Agent。
添加回答
舉報