使用 datastax 驱动程序,如何将非原始列读取为 JSON 字符串?
Posted
技术标签:
【中文标题】使用 datastax 驱动程序,如何将非原始列读取为 JSON 字符串?【英文标题】:Using datastax driver, how can I read a non-primitive column as a JSON string? 【发布时间】:2017-08-16 10:17:06 【问题描述】:我的 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 而无需显式干预编解码器和所有内容?
【问题讨论】:
【参考方案1】:使用 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"
【讨论】:
感谢 Ashraful,这很有帮助。知道我们是否也可以通过 datastax 驱动程序做到这一点?我问是因为我们必须运行“Select *”查询并且不能在该查询中添加 toJson() 方法。 你可以使用 select json * from users; 太棒了!非常感谢!以上是关于使用 datastax 驱动程序,如何将非原始列读取为 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 datastax 驱动程序创建 Cassandra 连接池