Как прочитать значение пути из JsonPatch? - PullRequest
0 голосов
/ 02 октября 2018

Пример:

У меня есть пример кода ниже:

import spray.json._
import gnieh.diffson.sprayJson._

val patchString1 = """[{"op": "replace", "path": "/emails","value":["xxx@yyy.com"] }]"""

val patchString2 = """[{"op": "replace", "path": "/emails/1","value":"xxx@yyy.com" }]"""

val patchOps1 = JsonPatch.parse(patchString1)
patchOps1.foreach(op => {
  println(op.path)  <<<< this prints /emails 
  println(op)     <<< this prints Replace(/emails,["xxx@yyy.com"],None)
})

У меня вопрос, как мне прочитать значение здесь, например, "xxx@yyy.com".

1 Ответ

0 голосов
/ 03 октября 2018
import spray.json._
case class IndividualMail(op: String, path: String, value: List[String])

object MailProtocol extends DefaultJsonProtocol {
  implicit object IndividualMailJsonFormat extends RootJsonFormat[IndividualMail] {

    def read(value: JsValue): IndividualMail = {
      value.asJsObject.getFields("op", "path", "value") match {
        case Seq(JsString(op), JsString(path), JsArray(value)) => IndividualMail(op, path, value.toList.map(_.toString()))
        case Seq(JsString(op), JsString(path), JsString(value)) => IndividualMail(op, path, List(value))
        case _ => throw deserializationError("Cannot Deserialize")
      }
    }

    def write(obj: IndividualMail): JsValue = {
      JsObject("op" -> JsString(obj.op),
        "path" -> JsString(obj.path),
        "value" -> JsArray(obj.value.map(JsString(_)).toVector)
      )
    }
  }
}
import MailProtocol._

val patchString1 = """[{"op": "replace", "path": "/emails","value":["xxx@yyy.com"] }]"""
val patchString2 = """[{"op": "replace", "path": "/emails/1","value":"xxx@yyy.com" }]"""

val a = patchString1.parseJson.convertTo[List[IndividualMail]]
val b = patchString2.parseJson.convertTo[List[IndividualMail]]

Проблема со значением поля в JSON заключается в его недетерминированности, поскольку значением может быть либо List, либо обычная строка.По этой причине вам может потребоваться определить свой собственный MailProtocol, с помощью которого вы можете получить необходимые значения.

...