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, с помощью которого вы можете получить необходимые значения.