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
相关产品推荐
相关产品推荐

