8

我想使用play 2.1框架自带的Json库。但我坚持将 json 对象反序列化回 java 列表。

使用 gson,您可以编写 s.th。喜欢

Type type = new TypeToken<List<XYZ>>(){}.getType();
List<XYZ> xyzList = gson.fromJson(jsonXyz, type); 

有没有办法对 play.libs.Json.fromJson 做同样的事情?

任何帮助表示赞赏。

编辑(17.12.2013):

我做了以下工作来解决这个问题。我想有更好的方法,但我没有找到。

List<MyObject> response = new ArrayList<MyObject>();
Promise<WS.Response> result = WS.url(Configuration.getRestPrefix() + "myObjects").get();
WS.Response res = result.get();
JsonNode json = res.asJson();
if (json != null) {
  for (JsonNode jsonNode : json) {
    if (jsonNode.isArray()) {
      for (JsonNode jsonNodeInner : jsonNode) {
        MyObject mobj = Json.fromJson(jsonNodeInner, MyObject.class);
        response.add(bst);
      }
    } else {
      MyObject mobj = Json.fromJson(jsonNode, MyObject.class);
      response.add(bst);
    }
  }
}
return response;
4

2 回答 2

8

Play Java 的 Json 库实际上只是对 Jackson JSON 库 ( http://jackson.codehaus.org/ ) 的一个薄包装。此处提到了 Jackson 反序列化自定义对象列表的方法。

对于您的情况,一旦您从响应正文中解析 json,您将执行以下操作,假设 MyObject 是一个普通的 POJO:

JsonNode json = res.asJson();
try{
    List<MyObject> objects = new ObjectMapper().readValue(json, new TypeReference<List<MyObject>>(){});
}catch(Exception e){
    //handle exception
}

我假设您根据您的编辑询问 Play Java,Play Scala 的 JSON 库也基于 Jackson,但具有更多功能和语法糖以适应函数式编程模式。

于 2013-12-19T19:48:31.427 回答
1

您可以使用以下代码:

List<YourClass> returnedRoles = new ObjectMapper().readValue(jsonString
   ,TypeFactory.defaultInstance().constructCollectionType(List.class,
   YourClass.class));
于 2014-11-19T08:24:07.637 回答