当您意识到HandlerMethodReturnValueHandler新的 JSR 353 API 没有什么特别之处时,答案就很简单了。相反,在这种情况下,RequestResponseBodyMethodProcessor(for @ResponseBody) 使用 aMappingJackson2HttpMessageConverter来序列化处理程序方法的返回值。
在内部,MappingJackson2HttpMessageConverter使用ObjectMapper. 默认情况下,ObjectMapper使用类的 getter 将对象序列化为 JSON。
假设您正在使用GlassfishJSR 353 的提供者实现,这些类是org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl、org.glassfish.json.JsonStringImpl和
org.glassfish.json.JsonNumberImpl, 和javax.json.JsonValue$3( value 的匿名类FALSE)。
因为JsonObjectImpl(your result, ie. root, object) 是一个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")
@ResponseBody
public String test() {
JsonObject result = Json.createObjectBuilder()
.add("name", "Dade")
.add("age", 23)
.add("married", false)
.build();
return result.toString();
}
或者自己制作HandlerMethodReturnValueHandler,稍微复杂一点,但更有价值。