是否可以确定请求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);
根据请求负载中是否存在startDate
和endDate
字段,我需要确定是否应该更新数据库中的start_date
和end_date
。
所以如果请求 JSON 是:
"name" : "action name",
"startDate" : null,
"endDate" : null
那么我应该将start_date
和end_date
字段更新为NULL。
但如果请求 JSON 是:
"name" : "action name"
那么我不应该更新 start_date
和 end_date
并保持原样。
那么是否可以确定参数startDate
和endDate
是否存在于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中是否存在参数的主要内容,如果未能解决你的问题,请参考以下文章
Shiro Ajax请求没有权限返回JSON,没有登录返回JSON