使用datastax驱动程序,我如何读取一个非原始列作为JSON字符串?

问题描述:

我在cassandra表中有几个非原始列。 其中一些是用户定义的类型UDT。使用datastax驱动程序,我如何读取一个非原始列作为JSON字符串?

在通过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没有与编解码器和所有明确的干预?

使用的toJSON方法

Starting with version 2.2 of Apache Cassandra™, toJson method return json representation of an object.

例子:

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) as 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"} 
+1

谢谢Ashraful,这是有帮助的。任何想法,如果我们也可以通过datastax驱动程序来做到这一点?我问,因为我们**必须运行“选择*”查询,并且不能在该查询中添加toJson()方法。 – user2250246

+2

你可以使用从用户选择json *; –

+0

精湛!非常感谢! – user2250246