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

Java Map转JSON数组及Spring MVC控制器方法返回类型咨询

解决Spring MVC控制器返回JSON数组的问题

嗨,我明白你现在的需求:把原本返回的LinkedHashMap转换成JSON数组,这样AJAX那边能更方便地处理数据。下面给你几个实用的方案,还有对应的返回类型建议:

方案一:直接返回Map条目列表(最快捷)

如果你的AJAX需要同时拿到时间键和状态值,直接把LinkedHashMap的条目转成列表返回就行,返回类型用List<Map.Entry<String, String>>。Spring会自动帮你把这个列表序列化成JSON数组,不用手动写Gson序列化代码:

@RequestMapping("/activeSlots")
@ResponseBody
public List<Map.Entry<String, String>> getTime(@RequestParam("date") String date){
    AvailableTimeSlot ts = new AvailableTimeSlot();
    List<String> bookedTime = ts.getInfo(date);
    LinkedHashMap<String,String> availTimeSlots = ts.availTime(bookedTime);
    // 把Map的键值对条目转成ArrayList,直接返回
    return new ArrayList<>(availTimeSlots.entrySet());
}

返回的JSON格式会是这样的数组:

[{"key":"09:00","value":"Available"},{"key":"10:00","value":"Booked"},...]

方案二:只返回Map的值列表(适合简单场景)

如果你只需要可用时间的字符串值,不需要键的话,返回类型用List<String>就好,直接提取Map的values转成列表:

@RequestMapping("/activeSlots")
@ResponseBody
public List<String> getTime(@RequestParam("date") String date){
    AvailableTimeSlot ts = new AvailableTimeSlot();
    List<String> bookedTime = ts.getInfo(date);
    LinkedHashMap<String,String> availTimeSlots = ts.availTime(bookedTime);
    // 提取所有值转成列表返回
    return new ArrayList<>(availTimeSlots.values());
}

返回的JSON就是纯字符串数组:

["09:00","10:00","11:00",...]

方案三:自定义DTO类(最规范)

如果想让返回的JSON结构更清晰(比如用time和status这样的字段名,而不是默认的key/value),可以自定义一个DTO类,然后返回List<TimeSlotDTO>:

首先创建DTO类:

public class TimeSlotDTO {
    private String time;
    private String status;

    // 构造方法
    public TimeSlotDTO(String time, String status) {
        this.time = time;
        this.status = status;
    }

    // 记得加上getter和setter,不然Spring没法序列化
    public String getTime() { return time; }
    public void setTime(String time) { this.time = time; }
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}

然后修改控制器方法:

@RequestMapping("/activeSlots")
@ResponseBody
public List<TimeSlotDTO> getTime(@RequestParam("date") String date){
    AvailableTimeSlot ts = new AvailableTimeSlot();
    List<String> bookedTime = ts.getInfo(date);
    LinkedHashMap<String,String> availTimeSlots = ts.availTime(bookedTime);
    
    List<TimeSlotDTO> slotList = new ArrayList<>();
    for (Map.Entry<String, String> entry : availTimeSlots.entrySet()) {
        slotList.add(new TimeSlotDTO(entry.getKey(), entry.getValue()));
    }
    return slotList;
}

返回的JSON数组结构会更友好:

[{"time":"09:00","status":"Available"},{"time":"10:00","status":"Booked"},...]

额外补充:如果坚持用Gson手动序列化

要是你还是想自己用Gson处理,返回类型可以保持String,但要把Map转成列表再序列化,这样得到的才是JSON数组而不是JSON对象:

@RequestMapping("/activeSlots")
@ResponseBody
public String getTime(@RequestParam("date") String date){
    AvailableTimeSlot ts = new AvailableTimeSlot();
    List<String> bookedTime = ts.getInfo(date);
    LinkedHashMap<String,String> availTimeSlots = ts.availTime(bookedTime);
    
    Gson gson = new Gson();
    // 把entrySet转成列表再序列化,得到JSON数组
    String json = gson.toJson(new ArrayList<>(availTimeSlots.entrySet()));
    return json;
}

不过这种方式不如让Spring自动序列化方便,毕竟Spring默认已经集成了Jackson,配置好的话直接返回对象/列表就行,不用手动处理序列化逻辑。

内容的提问来源于stack exchange,提问作者Suhas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:35:46