使用datastax驱动程序,如何将非基本列作为JSON字符串读取?

时间:2017-03-23 17:37:51

标签: cassandra datastax datastax-java-driver

我的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 个答案:

答案 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"}