亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

序列化:忽略一個元素包含空值的列表屬性

序列化:忽略一個元素包含空值的列表屬性

慕容3067478 2021-12-22 20:28:27
我正在使用 mongoDB 開發一個 java play 框架 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)類和/或字段進行注釋,但這僅適用type于Beneficiary類中的字段。有沒有辦法在不編寫自定義注釋的情況下做到這一點?
查看完整描述

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 {

.....

}


查看完整回答
反對 回復 2021-12-22
?
弒天下

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");

        }

        ....

    }

}


查看完整回答
反對 回復 2021-12-22
?
慕標琳琳

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。


查看完整回答
反對 回復 2021-12-22
  • 3 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號