java在SpringMVC中使用@ResponseBody返回JsonObject
我正在SpringMVC项目中使用JSON的新JavaAPI(JSR353)
其想法是生成一些Json数据并将其返回给客户端。我的控制器看起来有点像这样:
@RequestMapping("/test")
@ResponseBody
public JsonObject test() {
JsonObject result = Json.createObjectBuilder()
.add("name", "Dade")
.add("age", 23)
.add("married", false)
.build();
return result;
}
当我访问它时,我得到的不是预期的JSON表示,而是:
{"name":{"chars":"Dade","string":"Dade","valueType":"STRING"},"age":{"valueType":"NUMBER","integral":true},"married":{"valueType":"FALSE"}}
这是为什么?怎么回事?我如何让它正确地返回预期的JSON
# 1 楼答案
Sotirios Delimanolis给出的答案确实有效,但就我而言,我必须确保正确的HttpMessageConverter命令已经到位。这是因为我还需要将JodaTime值转换为ISO 8601格式。这个自定义WebMVCConfigureAdapter配置对我来说很有用:
# 2 楼答案
当您意识到新的JSR353API没有特别的
HandlerMethodReturnValueHandler
时,答案非常简单。相反,在本例中,RequestResponseBodyMethodProcessor
(for@ResponseBody
)使用MappingJackson2HttpMessageConverter
来序列化处理程序方法的返回值在内部,
MappingJackson2HttpMessageConverter
使用ObjectMapper
。默认情况下,ObjectMapper
使用类的getter将对象序列化为JSON假设您正在使用
Glassfish
的JSR353的提供者实现,这些类是org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
、org.glassfish.json.JsonStringImpl
和org.glassfish.json.JsonNumberImpl
和javax.json.JsonValue$3
(值FALSE
的匿名类)因为
JsonObjectImpl
(您的结果,即根,对象)是Map
(特殊类型),所以ObjectMapper
将映射的条目序列化为JSON键-值对元素,其中映射键是JSON键,映射值是JSON值。对于键,它可以很好地工作,序列化为name
、age
和married
。对于值,它使用我上面提到的类及其各自的getter。例如,org.glassfish.json.JsonStringImpl
实现为因此
ObjectMapper
使用JavaBean getter序列化JsonStringImpl
对象(即映射项的值),如下所示:其他领域也是如此
如果想要正确地编写JSON,只需返回一个
String
或者让你自己的
HandlerMethodReturnValueHandler
更复杂一点,但更有回报