Spring Rest Service应该返回Map而不是DTO for JSON

时间:2016-02-15 08:23:27

标签: java json spring-mvc

因为为每个请求创建DTO会很痛苦,所以我将其转换为地图。有没有其他方法可以比这更好地返回JSON?

public @ResponseBody
    Map<String, String> myTest() {    
        Map<String,String> myMap = new HashMap<String, String>();
        myMap.put("a", "1");
        myMap.put("b", "2");
        return myMap;
    }

2 个答案:

答案 0 :(得分:1)

我会说更好地使用DTO并让Spring / Jackson照顾所有的JSon,这是一个例子

@RequestMapping(value = "/payments", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<Payment> batchCreate(@RequestBody List<Payment> payments) {
    return paymentService.create(payments);
}

将Jackson添加到类路径

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.0</version>
    </dependency>

希望这有帮助。

或者创建自己的序列化程序

@RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
public @ResponseBody String get() throws JsonProcessingException {
    SpecialMap map = new SpecialMap();
    map.put("firstName", "Noby");
    map.put("lastName", "Stiles");

    ObjectMapper mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(SpecialMap.class, new MapSerializer());
    mapper.registerModule(module);

    String serialized = mapper.writeValueAsString(map);
    return serialized;
}

public class MapSerializer extends JsonSerializer<SpecialMap> {
    @Override
    public void serialize(SpecialMap map, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeStartObject();
        for (String key : map.keySet()) {
            jgen.writeStringField(key, map.get(key));
        }
        jgen.writeEndObject();
    }
}

public class SpecialMap extends HashMap<String,String> {

}

答案 1 :(得分:1)

如果你可以直接使用你的实体,你也可以这样做。你需要杰克森的一些额外功能。

  • 打破循环参考
  • 根据回复过滤属性

对于过滤我创建了一个小杰克森插件,允许动态过滤。可能它会有所帮助:

https://github.com/Antibrumm/jackson-antpathfilter