java - @Jsonproperty 整理字段映射问题
问题描述
假设我正在调用一个 API,该 API 使用以下 JSON 响应产品:
{
"success" : true,
"message" : "ok",
"product" : {
"name : "food",
"price" : 123
}
}
我试过用简单的 RequestDTO 转换它。
public class RequestDTO {
@JsonProperty("success")
boolean success;
@JsonProperty("message")
boolean message;
@JsonProperty("product.name")
Stirng name;
@JsonProperty("product.price")
Long price;
}
但这在 spring boot 项目中不起作用。
我想映射到产品字段而不创建Product
类
我应该如何序列化和反序列化?
解决方案
让我们首先编辑RequestDTO
:
@JsonSerialize(using = Serializer.class)
public class RequestDTO {
@JsonProperty("success")
boolean success;
@JsonProperty("message")
boolean message;
String name;
Long price;
@JsonProperty("product")
private void unpackNestedProduct(Map<String,Object> product) {
this.name = (String)product.get("name");
this.price = Long.valueOf((Integer)product.get("price"));
}
@JsonProperty("message")
private void unpackMessage(String messageStr) {
this.message = messageStr.equalsIgnoreCase("ok");
}
}
并添加一个Serializer
类:
public class Serializer extends StdSerializer<RequestDTO> {
public Serializer() {
this(null);
}
public Serializer(Class<RequestDTO> t) {
super(t);
}
@Override
public void serialize(RequestDTO value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeBooleanField("success", value.success);
jgen.writeStringField("message", value.message ? "ok" : "PutYourNotOKValueHere");
jgen.writeFieldName("product");
jgen.writeStartObject();
jgen.writeStringField("name", value.name);
jgen.writeNumberField("price", value.price);
jgen.writeEndObject();
jgen.writeEndObject();
}
}
然后我们可以这样做:
String json = "{\"success\": true, \"message\": \"ok\", \"product\":{ \"name\": \"food\", \"price\": 123}}";
ObjectMapper objectMapper = new ObjectMapper();
RequestDTO requestDTO = objectMapper.readValue(json, RequestDTO.class);
System.out.println("To Java object: "+ requestDTO);
System.out.println("Back to JSON: "+ objectMapper.writeValueAsString(requestDTO));
输出:
To Java object: RequestDTO(success=true, message=true, name=food, price=123)
Back to JSON: {"success":true,"message":"ok","product":{"name":"food","price":123}}
您可以在此处阅读更多选项:
推荐阅读
- javascript - 使用 Expo 从照片中删除对象(React Native)
- python - (已解决)有没有办法退出/结束旧递归(函数())而不完成它们?
- c# - System.InvalidOperationException:无法确定 Class.Property IEnumerable 的导航属性表示的关系
- powershell - 从变量中删除重复条目
- scala - (如何)你能 curry 组成一元函数吗?
- php - 我正在编写一个用于从多个表中选择行的 mysql 查询。我正在使用 mysql IN 运算符,以便我可以从给定的 IDS 集中进行选择
- python - 将参数传递给函数时如何定义条件?(在python中编码更有效)
- javascript - 有没有办法在赛普拉斯中对规范级别的文本进行断言?
- reactjs - 在 REACT 中复制而不引用状态对象
- javascript - Agora Web SDK NG - 存在停止屏幕共享事件?