使用 Java API 以 JSON 格式获取所有 Cassandra 查询结果

Get all Cassandra query result in JSON format Using Java API

cqlsh 中使用查询 select JSON * from table_name 我可以获得 JSON 格式的结果。我想使用 Datastax Java API.

做同样的事情
StringBuilder sb = new StringBuilder("SELECT json * FROM ").append("JavaTest.data");
String query = sb.toString();
ResultSet rs = session.execute(query);
List<Row> rows = rs.all();
String q1 = rows.toString();
System.out.println(q1);

但结果是:

[  
   Row   [  
      {  
         "id":1,
         "time":"12",
         "value":"SALAM"
      }
   ],
   Row   [  
      {  
         "id":2,
         "time":" 89",
         "value":" BYE"
      }
   ],
   Row   [  
      {  
         "id":3,
         "time":" 897",
         "value":" HelloWorld"
      }
   ]
]

它的格式不正确 JSON。我知道我可以获得一行的 JSON,但那样的话,我应该使用循环来获取 JSON 格式的所有结果。在 JAVA API 文档中搜索我找不到任何解决方案!

您需要使用以下内容 - 只需按原样获取 JSON 个字符串:

for (Row row : rs) {
    String json = row.getString(0);
    // ... do something with JSON string
}

如果你想将它们表示为对象列表,那么在迭代之前和之后添加方括号可能更容易,并在 JSON 个对象之间放置逗号,如下所示:

    ResultSet rs = session.execute("select json * from test.jtest ;");
    int i = 0;
    System.out.print("[");
    for (Row row : rs) {
        if (i > 0)
            System.out.print(",");
        i++;
        String json = row.getString(0);
        System.out.print(json);
    }
    System.out.println("]");

或者您可以为 ResultSet 编写自定义序列化程序,并将转换任务放入其中:

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(ResultSet.class, new ResultSetSerializer());
    mapper.registerModule(module);

    rs = session.execute("select * from test.jtest ;");
    String json = mapper.writeValueAsString(rs);
    System.out.println("'" + json + "'");

这是一项复杂得多的任务(您需要正确处理集合、用户定义的类型等),但您可以更好地控制序列化。

完整代码可在 this gist 获得。请注意,JSON 序列化程序仅处理 NULL、boolean 和 int 类型——其他一切都被视为字符串。但是理解一个idea就够了。