我的cassandra表中有几个非原始列。 其中一些是用户定义类型的UDT。
在通过datastax驱动程序查询它们时,我希望将这些UDT转换为JSON值。 更具体地说,我想获取下面的值对象的JSON字符串:
Row row = itr.next();
ColumnDefinitions cds = row.getColumnDefinitions();
cds.asList().forEach((ColumnDefinitions.Definition cd) -> {
String name = cd.getName();
Object value = row.getObject(name);
}
我已经完成了http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/
但我不想为我拥有的每个UDT添加编解码器。
看Using Datastax Java Driver to query a row as a JSON,我也试过了:
row.getString(name)
但它给了我一个错误:Codec not found for requested operation: [set<date> <-> java.lang.String]
如果没有明确干预编解码器,那么驱动程序能否以某种方式直接返回JSON?
答案 0 :(得分:2)
使用toJson方法
从Apache Cassandra™2.2版开始,toJson方法返回对象的json表示。
示例:
CREATE TYPE fullname (
firstname text,
lastname text
);
CREATE TABLE users (
id uuid PRIMARY KEY,
direct_reports set<frozen<fullname>>,
name frozen<fullname>
);
现在您可以选择direct_reports并将其命名为json
SELECT id,toJson(direct_reports) as direct_reports,toJson(name) as name FROM users ;
此处我将toJson(direct_reports)
重命名为direct_reports
,将toJson(name)
重命名为name
,以便您可以使用row.getString("direct_reports")
和row.getString("name")
获取direct_reports json并命名为json。
输出:
id | 62c36092-82a1-3a00-93d1-46196ee77204
direct_reports | [{"firstname": "Naoko", "lastname": "Murai"}, {"firstname": "Sompom", "lastname": "Peh"}]
name | {"firstname": "Marie-Claude", "lastname": "Josset"}