我的数据库中有一个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
并保持它们不变。
是否可以确定HTTP请求中是否存在参数startDate
和endDate
?也许杰克逊提供了一些开箱即用的解决方案?
答案 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);
}