我正在编写一个典型的Play Framework应用程序,我希望使用Jackson从Controller的方法返回JsonNode。
这就是我现在正在做的事情:
public static Result foo() {
MyPojoType myPojo = new myPojo();
String tmp = new ObjectMapper().writerWithView(JSONViews.Public.class).writeValueAsString(myPojo);
JsonNode jsonNode = Json.parse(tmp);
return ok(jsonNode);
}
是否可以避免使用“String tmp”副本并使用视图直接从MyPojoType转换为JsonNode? p>
也许我可以使用ObjectMapper.valueToTree,但我不知道如何为它指定JSonView。
答案 0 :(得分:3)
有趣的问题:副手,我不认为有一种特定的方法,而且您的代码是最直接的方法:valueToTree
方法不适用任何视图。
因此代码很好。
答案 1 :(得分:1)
经过更多的调查,这就是我最后所做的,以避免多余的工作:
public Result toResult() {
Content ret = null;
try {
final String jsonpayload = new ObjectMapper().writerWithView(JsonViews.Public.class).writeValueAsString(payload);
ret = new Content() {
@Override public String body() { return jsonpayload; }
@Override public String contentType() { return "application/json"; }
};
} catch (JsonProcessingException exc) {
Logger.error("toResult: ", exc);
}
if (ret == null)
return Results.badRequest();
return Results.ok(ret);
}
总结:方法ok,badRequest等接受play.mvc.Content类。然后,只需使用它来包装序列化的json对象。
答案 2 :(得分:0)
据我所知,使用jax-rs,你可以这样做:
public Response toResult() throws JsonProcessingException {
final ObjectWriter writer = new ObjectMapper()
.writerWithView(JSONViews.Public.class);
return Response.ok(new StreamingOutput() {
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
writer.writeValue(outputStream, /*Pojo*/ payload);
}
}).build();
}
所以你必须在Play框架中找到一个能够流式传输结果的类(通过OutputStream
)
答案 3 :(得分:-4)
我认为这是更有效的方式
public Result toResult() {
MyPojo result = new MyPojo();
JsonNode node = objectMapper.valueToTree(result);
return ok(node);
}