我有一个简单的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
,但没有帮助。
有人可以帮我吗?
答案 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是基准测试中最快的。