如何将Neo4j JSON转换为Java Object

时间:2013-12-24 11:10:00

标签: java neo4j

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

{
    "columns" : [ "username", "password", "accountNonExpired","accountNonLocked", "credentialsNonExpired", "enabled" ],
    "data" : [ [ "admin", "admin", true, false, true, false ]
}

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

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);

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

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

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

};

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

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

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

1 个答案:

答案 0 :(得分:2)

问题是数据不会以地图形式返回。

我通常这样做:

  1. 以地图
  2. 获取结果
  3. 获取columns列表
  4. 获取数据嵌套列表
  5. data上使用for循环获取每个row
  6. 在列上使用for循环,它是访问行中数据的索引
  7. 您还可以向用户Object添加工厂方法,以获取其中一个结果rows并构建您的User对象。

    e.g。

    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;
       }
    }
    

    你可以尝试使用Neo4j 2.0的东西是使用事务端点并返回节点对象(它只返回节点属性作为地图),然后你可以直接用Gson或Jackson映射到一个对象(行)。

    match (u:User {username:{username}})
    return u
    

    否则您也可以使用Neo4j 2.0中的文字地图语法

    match (u:User {username:{username}})
    return {username : u.username, password: u.password, ....} as user