使用 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_reportstoJson(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 连接池

如何阅读不同长度的子串

如何关闭数据库连接 Datastax Java 驱动程序

markdown 将非原始参数传递给Apex方法的问题

如何使用datastax java驱动程序将timeuuid插入cassandra或TimeUUID的版本无效

Python读取Excel,日期列读出来是数字的处理