上周,我花了很多(太多)时间来解决一个奇怪的问题。我想使用gnieh.diffson
来修补现有对象,客户端使用格式良好的Json补丁发送PATCH /api/test/patch
请求。然后我解析补丁并应用它:
import gnieh.diffson._
val patch = JsonPatch.parse(request.body.asText.getOrElse(""))
val workspace = """{"node":{}}"""
val result = patch(workspace)
println(result)
此代码在简单App
内正常工作,但在播放Controller
时失败:
[error] PatchException ::元素节点不存在 “{\”node \“:{}}”(JsonPatch.scala:140)
[错误] gnieh.diffson.Operation.action(JsonPatch.scala:140)
[错误] gnieh.diffson.Add.action(JsonPatch.scala:174)......
gnieh.diffson.JsonPatch#apply
类有3个apply
方法:
def apply(json : scala.Predef.String, compacted : scala.Boolean = { /* compiled code */ }) : scala.Predef.String = { /* compiled code */ }
def apply(value : net.liftweb.json.JValue) : net.liftweb.json.JValue = { /* compiled code */ }
def apply[T](<value : T>)(implicit evidence\$1 : scala.Predef.Manifest[T]) : T = { /* compiled code */ }
我认为第一个被调用是因为“ workspace ”是一个 String ,但我错了。被调用的方法是最后一个,有隐含的证据。
我目前的解决方案是将工作区解析为net.liftweb.json.JValue
,但我对此并不满意,因为:
- 我无法理解为什么这是被叫的最后一种方法
- 我必须将net.liftweb.json.JValue
格式化为字符串以重新创建play.api.libs.json.JsObject
..(因为我后来在我的过程中需要它)
请你解释一下为什么被叫方法更复杂?
非常感谢
答案 0 :(得分:1)
合同中有一条条款废弃了使用默认args的替代方案:
http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#overloading-resolution