当您意识到
HandlerMethodReturnValueHandler新的JSR 353 API
没有特殊要求时,答案很简单。相反,在这种情况下,
RequestResponseBodyMethodProcessor(for
@ResponseBody)使用
MappingJackson2HttpMessageConverter来序列化处理程序方法的返回值。
在内部,
MappingJackson2HttpMessageConverter使用
ObjectMapper。默认情况下,
ObjectMapper使用类的getter将对象序列化为JSON。
假设你正在使用
Glassfish的该JSR
353的提供者实现,这些类是
org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl,
org.glassfish.json.JsonStringImpl和
org.glassfish.json.JsonNumberImpl,和
javax.json.JsonValue$3(该值的匿名类
FALSE)。
因为
JsonObjectImpl(您的结果(即根,对象))是
Map(特殊类型),
ObjectMapper所以将地图的条目序列化为JSON键值对元素,其中Map键是JSON键,而Map值是JSON值。对于关键的,它工作正常,如序列化
name,
age和
married。对于值,它使用我上面提到的类及其各自的getter。例如,
org.glassfish.json.JsonStringImpl实现为
final class JsonStringImpl implements JsonString { private final String value; public JsonStringImpl(String value) { this.value = value; } @Override public String getString() { return value; } @Override public CharSequence getChars() { return value; } @Override public ValueType getValueType() { return ValueType.STRING; } ...}ObjectMapper因此,使用Java Bean getter来序列化
JsonStringImpl对象(即Map Entry的值),如下所示:
{"chars":"Dade","string":"Dade","valueType":"STRING"}其他字段也一样。
如果要正确编写JSON,只需返回
String。
@RequestMapping("/test", produces="application/json")@ResponseBodypublic String test() { JsonObject result = Json.createObjectBuilder() .add("name", "Dade") .add("age", 23) .add("married", false) .build(); return result.toString();}或自己制作
HandlerMethodReturnValueHandler,稍微复杂一点,但更有意义。



