当您意识到新的JSR 353 API没有特殊之处时,答案非常简单。相反,在本例中,(for ) 使用 a 序列化处理程序方法的返回值。HandlerMethodReturnValueHandler
RequestResponseBodyMethodProcessor
@ResponseBody
MappingJackson2HttpMessageConverter
在内部,使用 .默认情况下,使用类的 getter 将对象序列化为 JSON。MappingJackson2HttpMessageConverter
ObjectMapper
ObjectMapper
假设您使用的是 JSR 353 的提供程序实现,则这些类是 、 和 和 和 (值的匿名类)。Glassfish
org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
org.glassfish.json.JsonStringImpl
org.glassfish.json.JsonNumberImpl
javax.json.JsonValue$3
FALSE
因为(您的结果,即根,对象)是一个(特殊类型),将映射的条目序列化为 JSON 键值对元素,其中映射键是 JSON 键,映射值是 JSON 值。对于该键,它工作正常,序列化为 、 和 。对于值,它使用我上面提到的类及其各自的 getter。例如,实现为JsonObjectImpl
Map
ObjectMapper
name
age
married
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 getters 序列化对象(即 Map Entry 的值),如下所示JsonStringImpl
{"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