如何快速将JSON的params属性映射为DtoParamField列表?
问题描述
现有如下DTO类:
public class DtoParamField { private String name; private Object value; private DtoParamField(String name, Object value) { this.name = name; this.value = value; } }
期望接收的JSON格式(注:原示例JSON存在格式错误,正确JSON需用冒号分隔键值对,修正后如下):
{ "field1": "value1", "field2": "field2", "params": [{"name":"1", "value":"123"}, {"name":"2", "value":"123"}] }
需要实现:将JSON中的params属性快速映射为DtoParamField类型的列表。
最快最简单的实现方法
Java生态中最便捷的方式是借助Jackson(Spring Boot默认集成)完成JSON反序列化,步骤如下:
1. 修正DtoParamField的可序列化性
序列化框架需要能实例化对象并访问字段,以下两种方案二选一即可:
- 方案一:添加无参构造+字段getter/setter
public class DtoParamField { private String name; private Object value; // 添加无参构造 public DtoParamField() {} // 保留原有有参构造 private DtoParamField(String name, Object value) { this.name = name; this.value = value; } // 添加getter/setter public String getName() { return name; } public void setName(String name) { this.name = name; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } }
- 方案二:给私有有参构造加
@ConstructorProperties注解(让Jackson识别参数映射),同时添加getter(若需读取字段)
import com.fasterxml.jackson.annotation.ConstructorProperties; public class DtoParamField { private String name; private Object value; @ConstructorProperties({"name", "value"}) private DtoParamField(String name, Object value) { this.name = name; this.value = value; } public String getName() { return name; } public Object getValue() { return value; } }
如果项目用Lombok,直接用@Data注解就能替代手写getter/setter和构造方法,代码更简洁:
import lombok.Data; @Data public class DtoParamField { private String name; private Object value; }
2. 定义接收完整JSON的主DTO类
创建包含所有JSON字段的主类,把params字段定义为List<DtoParamField>类型:
// 同样可用Lombok的@Data简化 public class MainDto { private String field1; private String field2; private List<DtoParamField> params; public MainDto() {} // getter/setter省略,用@Data则无需手写 public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public List<DtoParamField> getParams() { return params; } public void setParams(List<DtoParamField> params) { this.params = params; } }
3. 反序列化JSON(两种场景)
普通Java项目
直接用Jackson的ObjectMapper解析:
import com.fasterxml.jackson.databind.ObjectMapper; public class JsonParseDemo { public static void main(String[] args) throws Exception { String jsonStr = "{\n" + " \"field1\": \"value1\",\n" + " \"field2\": \"field2\",\n" + " \"params\": [{\"name\":\"1\", \"value\":\"123\"}, {\"name\":\"2\", \"value\":\"123\"}]\n" + "}"; ObjectMapper objectMapper = new ObjectMapper(); MainDto mainDto = objectMapper.readValue(jsonStr, MainDto.class); // 直接获取params列表并使用 mainDto.getParams().forEach(field -> System.out.println("name: " + field.getName() + ", value: " + field.getValue()) ); } }
Spring Boot项目
无需手动处理ObjectMapper,直接在Controller方法中用@RequestBody接收MainDto,框架自动完成反序列化:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @PostMapping("/parse") public void parseJson(@RequestBody MainDto mainDto) { // 直接使用mainDto中的params列表 List<DtoParamField> params = mainDto.getParams(); // 业务逻辑处理... } }
内容的提问来源于stack exchange,提问作者Evgeniy Zelenskiy
相关产品推荐
相关产品推荐

