我对当前Scala couchdb驱动程序的一个问题是它们是否可以使用“部分”模式“。我会尝试解释我的意思:我看到的库似乎都希望完全从JSON将数据库中的文档传递给Scala对象,处理Scala对象,然后将其转换回JSON。如果您的应用程序知道有关该类型对象的所有信息,这很好 - 特别是如果它是与之交互的唯一软件。那个数据库。但是,如果我想编写一个只知道JSON对象的一部分的小应用程序怎么办:例如,如果我只对这样嵌入的'mybook'组件感兴趣怎么办:
{
_id: "0ea56a7ec317138700743cdb740f555a",
_rev: "2-3e15c3acfc3936abf10ea4f84a0aeced",
type: "user",
profiles: {
mybook: {
key: "AGW45HWH",
secret: "g4juh43ui9hg929gk4"
},
.. 6 or 7 other profiles
},
.. lots of other stuff
}
我真的不想将整个JSON AST转换为Scala对象。另一方面,在couchdb中,您必须保存整个JSON文档,因此需要以某种方式保留它。我觉得我真的是这样的:
class MyBook {
private val userJson: JObject = ... // full JSON retrieved from the database
lazy val _id: String = ... // parsed from the JSON
lazy val _rev: String = ... // parsed from the JSON
lazy val key: String = ... // parsed from the JSON
lazy val secret: String = ... // (ditto)
def withSecret(secret: String): MyBook = ... // new object with altered userJson
def save(db: CouchDB) = ... // save userJson back to couchdb
}
优点:
Disadavantages:
对于任何当前的Scala驱动程序,这是否可行?使用scouchdb或新的Sohva库,似乎没有。
答案 0 :(得分:1)
答案 1 :(得分:0)
My couchDB library使用spray-json进行(反)序列化,这非常灵活,可以让你忽略文档的某些部分但仍然保存它。让我们看一个简化的例子:
假设我们有这样的文件
{
dontcare: {
...
},
important: "foo"
}
然后,您可以声明一个类来保存本文档中的信息,并定义转换的完成方式:
case class Dummy(js:JsValue)
case class PartialDoc(dontcare: Dummy, important: String)
implicit object DummyFormat extends JsonFormat[Dummy] {
override def read(js:JsValue):Dummy = Dummy(js)
override def write(d:Dummy):JsValue = d.js
}
implicit val productFormat = jsonFormat2(PartialDoc)
这将忽略dontcare
中的任何内容,但仍然可以将其作为原始JSON AST保护。当然这个例子并不像你问题中那样复杂,但是它应该让你知道如何解决你的问题。