是否可以确定请求JSON中是否存在参数

时间:2019-03-13 08:59:04

标签: java json spring-boot serialization jackson

我的数据库中有一个action表,因此我有Action实体和ActionDTO基本上是相同的。

实体为:

@Entity
@Table(name = "action")
public class Action {

    @Column(name = "name")
    private String name;

    @Column(name = "start_date")
    private Date startDate;

    @Column(name = "end_date")
    private Date endDate;

    //setters & getters
}

DTO是:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ActionDTO {
    private String name;
    private Date startDate;
    private Date endDate;

    //setters & getters
}

在控制器中,有一种方法可以更新action表:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody ActionDTO actionDTO) {
    Action action = new Action();

    // setting parameters to Action entity

    actionRepository.save(action);
}

根据请求有效负载中字段startDateendDate的存在与否,我需要确定是否应该更新数据库中的start_dateend_date

因此,如果请求JSON为:

{
    "name" : "action name",
    "startDate" : null,
    "endDate" : null
}

然后我应该start_dateend_date字段更新为NULL。

但是如果请求JSON是:

{
    "name" : "action name"
}

然后,我不应该更新start_dateend_date并保持它们不变。

是否可以确定HTTP请求中是否存在参数startDateendDate?也许杰克逊提供了一些开箱即用的解决方案?

2 个答案:

答案 0 :(得分:2)

#count Yes values only in Match columns s = df.filter(like='Match').eq('Yes').sum(axis=1) #mask for unique combinations m1 = ~df.duplicated(['Price','Name'], keep=False) #create new column filled by Series s m2 = df.assign(new=s).groupby(['Price','Name'])['new'].rank(ascending=False).eq(1) #chain masks by bitwise OR df['final_match'] = np.where(m1 | m2, 'Full ','Partial') print (df) ID Name Match1 Random_Col Match2 Price Match3 Match4 Match5 \ 0 1 Apple Yes Random Value No 10 Yes Yes Yes 1 2 Apple Yes Random Value1 No 10 Yes Yes No 2 3 Apple Yes Random Value2 No 15 No Yes Yes 3 4 Orange No Random Value Yes 12 Yes Yes No 4 5 Orange No Random Value Yes 12 No No No 5 6 Banana Yes Random Value No 15 Yes No No 6 7 Apple Yes Random Value No 15 No Yes Yes final_match 0 Full 1 Partial 2 Partial 3 Full 4 Partial 5 Full 6 Partial 的术语来说,缺失字段和设置为ObjectMapper的字段是相同的。因此,通过将null反序列化为String,您将无法查看字段是否存在。但是,如果您要这样做,则可以尝试将json反序列化为POJO,例如:

Map

答案 1 :(得分:0)

您可以使用ObjectMapper.readTree来读取JsonNode对象的树,然后使用JsonNode.has方法来检查节点中是否存在字段:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody String json) {
    Action action = new Action();
    JsonNode jsonNode = objectMapper.readTree(json);
    if (jsonNode.has("startDate")) {
        // fill action object
    }

    actionRepository.save(action);
}