dad*_*ade 17 java json spring-mvc
我在SpringMVC项目中使用新的Java API(JSR 353)来实现JSON.
我们的想法是生成一些Json数据并将其返回给客户端.控制器我看起来有点像这样:
@RequestMapping("/test")
@ResponseBody
public JsonObject test() {
JsonObject result = Json.createObjectBuilder()
.add("name", "Dade")
.add("age", 23)
.add("married", false)
.build();
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我访问它时,而不是获得JSON的预期表示,我得到这些:
{"name":{"chars":"Dade","string":"Dade","valueType":"STRING"},"age":{"valueType":"NUMBER","integral":true},"married":{"valueType":"FALSE"}}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?到底是怎么回事?如何让它正确返回预期的JSON?
Sot*_*lis 24
当您意识到HandlerMethodReturnValueHandler新的JSR 353 API 没有特殊之处时,答案非常简单.相反,在这种情况下,RequestResponseBodyMethodProcessor(for @ResponseBody)使用a 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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
ObjectMapper因此,使用Java Bean getter来序列化JsonStringImpl对象(即Map Entry的值),如
{"chars":"Dade","string":"Dade","valueType":"STRING"}
Run Code Online (Sandbox Code Playgroud)
这同样适用于其他领域.
如果要正确编写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();
}
Run Code Online (Sandbox Code Playgroud)
或者做一些自己的HandlerMethodReturnValueHandler,有点复杂,但更有价值.
| 归档时间: |
|
| 查看次数: |
73450 次 |
| 最近记录: |