以JSON格式获取所有Cassandra查询结果使用Java API

时间:2018-02-02 08:53:37

标签: java json cassandra

cqlsh 中使用查询select JSON * from table_name我可以获得JSON格式的结果。我想使用 Datastax Java API执行相同的操作。

StringBuilder sb = new StringBuilder("SELECT json * FROM ").append("JavaTest.data");
String query = sb.toString();
ResultSet rs = session.execute(query);
List<Row> rows = rs.all();
String q1 = rows.toString();
System.out.println(q1);

但结果是:

[  
   Row   [  
      {  
         "id":1,
         "time":"12",
         "value":"SALAM"
      }
   ],
   Row   [  
      {  
         "id":2,
         "time":" 89",
         "value":" BYE"
      }
   ],
   Row   [  
      {  
         "id":3,
         "time":" 897",
         "value":" HelloWorld"
      }
   ]
]

它的格式不正确JSON。我知道我可以获得行的JSON但是这样,我应该使用循环来获得JSON格式的所有结果。在JAVA API文档中搜索我无法找到任何解决方案!

1 个答案:

答案 0 :(得分:2)

您需要使用以下内容 - 只需按原样获取JSON字符串:

for (Row row : rs) {
    String json = row.getString(0);
    // ... do something with JSON string
}

如果您想将它们表示为对象列表,那么在&amp;之前添加方括号可能会更容易。迭代之后,在JSON对象之间添加逗号,如下所示:

    ResultSet rs = session.execute("select json * from test.jtest ;");
    int i = 0;
    System.out.print("[");
    for (Row row : rs) {
        if (i > 0)
            System.out.print(",");
        i++;
        String json = row.getString(0);
        System.out.print(json);
    }
    System.out.println("]");

或者您可以为ResultSet编写自定义序列化程序,并将转换任务放入其中:

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(ResultSet.class, new ResultSetSerializer());
    mapper.registerModule(module);

    rs = session.execute("select * from test.jtest ;");
    String json = mapper.writeValueAsString(rs);
    System.out.println("'" + json + "'");

这是一项更复杂的任务(您需要正确处理集合,用户定义的类型等),但您可以更好地控制序列化。

this gist提供完整代码。请注意,JSON序列化程序只处理NULL,boolean&amp; int类型 - 其他所有内容都被视为字符串。但这足以理解一个想法。