【问题标题】:Get all Cassandra query result in JSON format Using Java API使用 Java API 以 JSON 格式获取所有 Cassandra 查询结果
【发布时间】:2018-07-12 17:40:36
【问题描述】:

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 Docs 中搜索我找不到任何解决方案!

【问题讨论】:

    标签: java json cassandra datastax-java-driver


    【解决方案1】:

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

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

    如果您想将它们表示为对象列表,那么在迭代之前和之后添加方括号会更容易,并在 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、布尔和 int 类型 - 其他所有内容都被视为字符串。但理解一个想法就足够了。

    【讨论】:

    • 正如我在问题中所说,我不想使用循环。没有任何方法可以获取整个查询结果的 JSON 吗?
    • 没有这样的 API 可以使用...我建议改变方法 - 不要在 SELECT 中使用 JSON,而是将 Rowset/Row 编组为 JSON...
    • 谢谢,你能举个例子或来源吗?
    猜你喜欢
    • 2023-04-03
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多