You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18