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

Posted

技术标签:

【中文标题】是否可以确定请求JSON中是否存在参数【英文标题】:Is it possible to determine whether parameters are present in request JSON 【发布时间】:2019-08-03 21:22:11 【问题描述】:

我的数据库中有一个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 并保持原样。

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

【问题讨论】:

不是 PUT 操作应该如何工作。放置数据应始终更新所有字段。 JSON 中缺少的字段相当于 将字段设置为null。在这种情况下,PUT 操作应该更新数据库,以便结果也是null(在那些字段中)。您正在询问如何仅更新对象的一部分。为此,存在 PATCH 操作,其 JSON 表示看起来相似但不同。 【参考方案1】:

您可以使用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);

【讨论】:

【参考方案2】:

ObjectMapper 的术语中,缺少的字段和设置为null 的字段是相同的。因此,通过将String 反序列化为POJO,您将无法查看字段是否存在。但是,如果这是您想要做的,那么您可以尝试将 json 反序列化为 Map,例如:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody Map payload) 
    if(payload.containsKey("")) 
        //Something
    

【讨论】:

以上是关于是否可以确定请求JSON中是否存在参数的主要内容,如果未能解决你的问题,请参考以下文章

使用JSON主体的HTTP GET请求是否有大小限制?

Shiro Ajax请求没有权限返回JSON,没有登录返回JSON

是否可以在 Axios 中发送带有 JSON 正文的 get 请求?

request接收不存在的参数会是啥结果

是否对同源域的 ajax 调用进行了预检请求?

接口签名实现