有效地将关系数据转换为JSON

时间:2015-07-30 13:59:57

标签: java mysql json java-ee

我有以下表People

enter image description here

我想获取关系记录并使JSON数组如下:

{ "Person":[
    {"ID":1, 
     "FirstName":"James", 
     "LastName":"Donovan",
     "Child":[
         {"ID":6, "FirstName":"Nikolai", "LastName":"Donovan"}
     ]
    },
    {"ID":2, 
     "FirstName":"Jeffrey", 
     "LastName":"Williams",
     "Child":[
         {"ID":4, "FirstName":"Carol", "LastName":"Williams"},
         {"ID":5, "FirstName":"Sarah", "LastName":"Williams"}
     ]
    },
    .... and so on
  ]
}

我使用以下方法; 以下代码的简短摘要:我在循环中执行两次db操作并将节点放入JSON对象符合某些条件。

preparedStatement = con.prepareStatement("SELECT * FROM PEOPLE");
rs = preparedStatement.executeQuery(); // ResultSet Object

if (rs != null && rs.next()) {
    Roles = new JSONObject();
    parentNode = new JSONObject();
    childNode = new JSONObject();

    while(rs.next()) {
        parentNode.put("ID", rs.getInt("Id"));
        parentNode.put("FirstName", rs.getString("firstname"));
        parentNode.put("LastName", rs.getString("lastname"));

        if(rs.getInt("parent") > 0) { // Equal 0 Mean it has not child
            // Perform again database operation and get record related to parent id
            preparedStatement = con.prepareStatement("SELECT * FROM PEOPLE WHERE parent=?");
            preparedStatement.setString(1, rs.getInt("id");
            resultSet2 = preparedStatement.executeQuery();

            while(resultSet2.next()) {
                childNode.put("ID", rs.getInt("Id"));
                childNode.put("FirstName", rs.getString("firstname"));
                childNode.put("LastName", rs.getString("lastname"));

                parentNode.put("Child":childRole); // put child into parent node
            }
       }
    }
}

我想要什么? 对于服务器端,在循环中执行db select查询太昂贵

是否有更好的解决方案可以生成所需的关系数据JSON,并使我免于额外的SELECT操作!

我很感谢你的关注!

3 个答案:

答案 0 :(得分:0)

如果您使用的是mysql 5.7,则可以通过JSON_ARRAY函数创建json数组。或者JSON_OBJECT https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html

答案 1 :(得分:0)

可能会使用两个查询。

  1. 选择父亲= 0的blah。
  2. 选择blah where parent!= 0 order by parent,id
  3. 循环遍历第二个结果集的结果,并将它们分配给第一个结果集中的父级。

    使用gson(或jackson或您喜欢的任何json库)将对象列表转换为最终的jason。

    简短的代码类似的东西

    select the parents (parent = 0).
    for each parent row, add the row to a Map<String, Entity> where the key is the parent id.
    
    select the children (parent != 0).
    for each child row, get the parent row from the map using the parent id then add them to the parent entity.
    

    对父行和子行使用相同的类,将子集初始化为null,并在第一次添加子项时创建它。这样,子数组将包含给有子女的父母,不包括没有子女和子女的父母。

答案 2 :(得分:-1)

您可以发出一个选择

SELECT p.ID, p.FirstName, p.LastName, c.ID, c.FirstName, c.LastName 
FROM PEOPLE p LEFT OUTER JOIN PEOPLE c ON c.parent = p.ID
ORDER BY p.ID

然后遍历结果。 每当父ID更改(并且对于第一个结果行)时,您将构建新的当前parentNode。然后你读取子数据(如果父项没有子项,则可能为空)并将其放入当前parentNode的子json数组中。