当您意识到HandlerMethodReturnValueHandler
新的 JSR 353 API 没有什么特别之处时,答案就很简单了。相反,在这种情况下,RequestResponseBodyMethodProcessor
(for @ResponseBody
) 使用 aMappingJackson2HttpMessageConverter
来序列化处理程序方法的返回值。
在内部,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
( 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
,稍微复杂一点,但更有价值。