gpt4 book ai didi

java - DTO 中的动态字段类型

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:00:02 25 4
gpt4 key购买 nike

我正在使用 Spring-MVC我有一个结构如下的 DTO 来接收 JSON来自客户端(foo 实体)的数据,以使用JPA 将其保存到数据库中:

public class FooDTO {

public Integer id;
public String label;
public Double amount;
public List<Integer> states;
...

但是当客户端想要编辑foo实体我必须像下面这样构造它

public class FooDTO {

public Integer id;
public String label;
public Double amount;
public List<SimpleDto> states;
...

SimpleDto

public class SimpleDto {
public Integer value;
public String label;
}

区别只是 states有时输入 List<SimpleDto>有时 List<Integer>而且我不想创建另一个 dto。

那么如何在我的 dto (json) 中实现动态字段类型?

P.S JSON数据由com.fasterxml.jackson.core处理

最佳答案

使用自定义解串器是解决问题的一种方法

    public class DynamicDeserializer extends JsonDeserializer {
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String requestString = jp.readValueAsTree().toString();
JSONArray jo = new JSONArray(requestString);
List<SimpleDto> simpleDtoList = new ArrayList<>();
List<Integer> integers = new ArrayList<>();
if(jo!=null && jo.length()>0) {
for (int i = 0; i < jo.length(); i++) {
Object string = jo.get(0);
if(string!=null && string instanceof JSONObject){
JSONObject value = jo.getJSONObject(i);
SimpleDto simpleDto = new SimpleDto();
simpleDto.setValue(value.getInt("value"));
simpleDtoList.add(simpleDto);
}else{
integers.add(jo.getInt(0));
}
}
}


return integers.isEmpty() ? simpleDtoList:integers;
}
}

发送和打印请求的 Controller

@PostMapping("/test")
public Optional<TestObject> testDynamicMapper(
@RequestBody final TestObject testObject) {
List<Object> states = testObject.getStates();

for (Object object:states) {
if(object instanceof SimpleDto){
SimpleDto dto = (SimpleDto)object;
System.out.println(dto.getValue());
}
if(object instanceof Integer){
Integer dto = (Integer)object;
System.out.println(dto);
}
}


return Optional.of(testObject);
}

有泛型映射的pojo类

public class TestObject implements Serializable {

@JsonDeserialize(using = DynamicDeserializer.class)
private List<Object> states;


public List<Object> getStates() {
return states;
}

public void setStates(List<Object> states) {
this.states = states;
}


}

对象列表的输入负载

{
"states": [
{
"label": "1",
"value": 0
}
]
}

整数列表的输入负载

{
"states": [
1,2
]
}

关于java - DTO 中的动态字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55912805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com