在 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
文档中搜索我无法找到任何解决方案!
答案 0 :(得分:2)
您需要使用以下内容 - 只需按原样获取JSON字符串:
for (Row row : rs) {
String json = row.getString(0);
// ... do something with JSON string
}
如果您想将它们表示为对象列表,那么在&amp;之前添加方括号可能会更容易。迭代之后,在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&amp; int类型 - 其他所有内容都被视为字符串。但这足以理解一个想法。