将N1QLQuery响应转换为Scala中的自定义对象

时间:2019-02-18 07:58:02

标签: scala couchbase n1ql

我有一个简单的case class

case class Account(accountId: Long, login: DateTime)

现在,我想通过简单的N1QL查询从Couchbase存储桶中检索文档(它应该返回一个简单的JSON文档列表,其中包含两个字段):

val query = "SELECT u.accountId, u.login FROM `accounts` u WHERE DATE_DIFF_STR(NOW_STR(), u.login, 'day') > 30"
bucket.query(N1qlQuery.simple(query)).map(rows => rows.map(row => row.value().asInstanceOf[Account]).seq)

但是,邮递员那里出现错误:

java.lang.ClassCastException: com.couchbase.client.java.document.json.JsonObject cannot be cast to com.package.account

我的问题是-如何将文档从数据库转换为自定义对象?我也尝试过先将其转换为RawJSONDocument,但没有帮助。 有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

首先,您可能想知道我们目前正在积极开发本机Couchbase Scala SDK,并将于今年发布,它将支持您将行直接转换为case类的用例。

但是在现在,没有,您不能直接将JsonObject转换为case类。您将需要使用toString提取原始JSON字符串,然后使用Scala JSON库进行转换。您在这里有几种选择:

杰克逊

    val json = row.value().toString()
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)
    val account = mapper.readValue(json, classOf[Account])

uPickle

    val account = upickle.default.read[Account](json)

Jsoniter

    val account = com.github.plokhotnyuk.jsoniter_scala.core.readFromString[Account](json)

另外还有Circe,Json4s,Play Json,Jawn等。

FWIW,我发现Jsoniter是基准测试中最快的。