2016-02-29 50 views
0

我不能拿出解決方案補丁語義:實現谷歌PATCH語義與Playframework 2.4 Json的變壓器

  1. 如果JSON有沒有財產,我需要跳過修改
  2. 如果JSON酒店null,我需要刪除此屬性(不要求性能)在其他情況下
  3. 我需要設置的值

我需要轉化爲mongo.db更新命令(「$ unset」爲2,「$ set」爲3)

例如我需要存儲json與必需屬性「摘要」。所以:

{"summary": "modified by patch", "description": null} 

必須轉換成:

{ 
    "$set" : { 
    "summary": "modified by patch" 
    }, 
    "$unset": { 
    "description": "" 
    } 
} 

此JSON

{"description": null} 

必須轉換成( 「摘要」 跳過):

{ 
    "$unset" : { 
    "description": "" 
    } 
} 

和爲此

{"summary": null} 

我需要轉換錯誤(不能刪除必需的屬性)

回答

1

我的解決辦法是

def patch(path: JsPath)(r: Reads[JsObject]) = Reads{json => 
    path.asSingleJsResult(json).fold(
    _ => JsSuccess(Json.obj()), 
    _ => r.reads(json) 
) 
} 

和性能需要選用

def requiredError = ValidationError("error.remove.required") 

val summaryPatch = patch(__ \ "summary")(
    (__ \ "$set" \ "summary").json.copyFrom( 
    (__ \ "summary").json.pick.filterNot(requiredError)(_ == JsNull) 
) 
) 

其他

val descriptionPatch = patch(__ \ "description")(
    (__ \ "$set" \ "description").json.copyFrom(
    (__ \ "description").json.pick.filterNot(_ == JsNull) 
) orElse 
    (__ \ "$unset" \ "description").json.copyFrom( 
    (__ \ "description").json.pick) 
) 
) 

mongo.db變形器:

toMongoPatch = (summaryPatch and descriptionPatch).reduce