如何将Neo4j JSON转换为Java Object

Pau*_*yer 5 java neo4j

我已经玩了几个星期Neo4j 2.0 RC1.我正在使用Neo4j作为数据库编写Spring Security实现.当我加载用户时,我从Neo4j得到的响应如下所示:

{
    "columns" : [ "username", "password", "accountNonExpired","accountNonLocked", "credentialsNonExpired", "enabled" ],
    "data" : [ [ "admin", "admin", true, false, true, false ]
}
Run Code Online (Sandbox Code Playgroud)

最初只返回用户名密码(两个字符串)和我能够执行此操作的字段:

class Result
{
    private List<String> columns = new ArrayList<String>();

    private List<ArrayList<String>> data = new ArrayList<ArrayList<String>>();

};

ClientRespose resp = webResource.path(path).type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, body );
String s = response.getEntity(String.class);
Result r = new Gson().fromJson(s, Result.class);
Run Code Online (Sandbox Code Playgroud)

当然,当我添加其他字段(布尔)时,我需要将Result更改为如下所示:

class Result
{
    private List<String> columns = new ArrayList<String>();

    private List<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();

};
Run Code Online (Sandbox Code Playgroud)

我的代码仍然有效,但是当我尝试将任何数据项转换为String或Boolean时,我得到了"未能将对象转换为..."异常.这当然是因为没有类型信息,所以GSon正在创建Object实例来放置它.

所以我猜测必须有更好的方法来处理从Neo4j返回的JSON?

我可以以某种方式跳过JSON转换阶段并让Jersey HTTP客户端直接填充我的User对象吗?

Mic*_*ger 2

问题是数据没有作为地图返回。

我通常这样做:

  1. 获取结果作为 Map
  2. 获取columns列表
  3. 获取数据嵌套列表
  4. 使用 for 循环data来获取每个row
  5. 使用 for 循环遍历列及其索引来访问行中的数据

您还可以向用户对象添加一个工厂方法,该方法获取这些结果之一rows并构造您的用户对象。

例如

class User {
   public static User from(List<Object> row) {
      User u=new User((String)row.get(0),(String)row.get(1));
      u.setAccountNonExpired((Boolean)row.get(2));
      u.setAccountNonLocked((Boolean)row.get(3));
      u.setCredentialsNonExpired((Boolean)row.get(4));
      u.setEnabled((Boolean)row.get(5));
      return u;
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以在 Neo4j 2.0 中尝试使用事务端点并返回节点对象(它将仅返回节点属性作为映射),然后您可以使用 Gson 或 Jackson 直接将其映射到对象(行)。

match (u:User {username:{username}})
return u
Run Code Online (Sandbox Code Playgroud)

否则你也可以使用 Neo4j 2.0 中的文字映射语法

match (u:User {username:{username}})
return {username : u.username, password: u.password, ....} as user
Run Code Online (Sandbox Code Playgroud)