我将对象作为 JSON 字符串存储在我的数据库中。我想制作一个公开这些字符串的 REST 服务。然而,当我编写我的方法时,我得到的字符串的引号被转义了。例如,我包含了一个返回字符串的方法,
@RequestMapping(value = "test", method = RequestMethod.GET)
public @ResponseBody
String getTest() {
return "{\"a\":1, \"b\":\"foo\"}";
}
但是当我在浏览器中调用此方法时,当我真正想要发生的是 {"a":1 , "b": "foo"}。我认为“字符串”作为返回类型可能是问题所在,但我还能做什么?包装类做同样的事情:
{
"value" : "{\"a\":1, \"b\":\"foo\"}"
}
我可以序列化它然后返回对象,但这似乎有点荒谬。这可能是我的配置文件的相关部分:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJacksonHttpMessageConverter());
}
@Bean
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper);
mappingJacksonHttpMessageConverter.setPrettyPrint(true);
return mappingJacksonHttpMessageConverter;
}
谢谢
编辑:正如下面所建议的,字符串似乎被双重编码。注释掉我的配置中的 2 个类可以解决这个问题。但是,我仍然有其他地方想要返回对象,并希望让那些通过我知道在哪里配置的通用序列化 bean 运行。所以我认为我的选择是:a)自己做所有的序列化。所有的方法都返回字符串,那些已经是 JSON 的返回自己,那些是对象的都返回 JSONUtil.toJson(object)。我不喜欢这种方法,但我知道它会起作用。b) 使用一个看起来像这样的包装类:
public static class Wrapper {
@JsonRawValue
private final String value;
}
这导致前面有一个尴尬的“价值”,尽管这没有真正的意义。
基本上我想要的是@JsonRawValue,但是让它在 RequestMapping 方法而不是属性上工作。想法?意见?其他建议?