从任何Json更新所有值

从任何Json更新所有值,json,scala,playframework,Json,Scala,Playframework,我有一些json,我必须加密所有的值。下面是一个json,其所有值都应更新: json = Json.parse("""{ "key1" : 1.5, "key2" : [ {"key211": 1, "key212": "value212"}, {"key221": 2, "key222": "value222"} ] "key3" : { "key31" : true, "key32" : "va

我有一些json,我必须加密所有的值。下面是一个json,其所有值都应更新:

json = Json.parse("""{ "key1" : 1.5, "key2" : [ {"key211": 1, "key212": "value212"}, {"key221": 2, "key222": "value222"} ] "key3" : { "key31" : true, "key32" : "value32" }, "key4" : 17 }""" json=json.parse(“”){ “关键1”:1.5, “键2”:[ {“key211”:1,“key212”:“value212”}, {“key221”:2,“key222”:“value222”} ] “键3”:{ “key31”:正确, “键32”:“值32” }, “键4”:17 }""" 加密并更新所有值后,应如下所示:

val json = Json.parse("""{ "key1" : "uhKhbofQtL", "key2" : [ {"key211": "FxnbGGZFMW", "key212": "VsdfdGfg"}, {"key221": "sdffFdd", "key222": "Fsdfsfds"} ] "key3" : { "key31" : "Fsdfasdf", "key32" : "Vsdfsdfsdfs" }, "key4" : "sfsdfFSdfs" }""" val json=json.parse(“”){ “键1”:“uhKhbofQtL”, “键2”:[ {“key211”:“FxnbGGZFMW”,“key212”:“VsdfdGfg”}, {“key221”:“sdffFdd”,“key222”:“Fsdfsfds”} ] “键3”:{ “key31”:“Fsdfasdf”, “key32”:“vsdfsfs” }, “键4”:“sfsdfFSdfs” }"""
如何操作?

将其解析为
映射
,然后遍历映射并加密:

 def encrypt(data: Any, enc: Any => String): Any = data match { 
   case v: Map[String, Any] => v.map { case (k,v) => k -> encrypt(v, enc) }
   case v: List[Any] => v.map(encrypt(_, enc))
   case v => enc(v)
}

将其解析为
映射
,然后遍历映射并加密:

 def encrypt(data: Any, enc: Any => String): Any = data match { 
   case v: Map[String, Any] => v.map { case (k,v) => k -> encrypt(v, enc) }
   case v: List[Any] => v.map(encrypt(_, enc))
   case v => enc(v)
}

我已经解决了这个问题,解决方案如下

  implicit val readsMap: Reads[Map[String, Any]] = Reads[Map[String, Any]](m => Reads.mapReads[Any](metaValueReader).reads(m))
  implicit val writesMap: Writes[Map[String, Any]] = Writes[Map[String, Any]](m => Writes.mapWrites[Any](metaValueWriter).writes(m))

  def metaValueReader(jsValue: JsValue): JsResult[Any] = jsValue match {
    case JsObject(m) => JsSuccess(m.map { case (k, v) => k -> metaValueReader(v) })
    case JsArray(arr) => JsSuccess(arr.map(metaValueReader))
    case JsBoolean(b) => JsSuccess(b).map(encryptValue)
    case JsNumber(n) => JsSuccess(n).map(encryptValue)
    case JsString(s) => JsSuccess(s).map(encryptValue)
    case JsNull => JsSuccess("").map(encryptValue)
    case badValue => JsError(s"$badValue is not a valid value")
  }

  def metaValueWriter(value: Any): JsValue = value match {
    case jsRes: JsSuccess[Any] => metaValueWriter(jsRes.get)
    case m: Map[String, Any] => JsObject(m.map { case (k, v) => k -> metaValueWriter(v) })
    case arr: Seq[Any] => JsArray(arr.map(metaValueWriter))
    case s: String => JsString(s)
  }

如何改进此代码?

我已解决此问题,解决方案如下

  implicit val readsMap: Reads[Map[String, Any]] = Reads[Map[String, Any]](m => Reads.mapReads[Any](metaValueReader).reads(m))
  implicit val writesMap: Writes[Map[String, Any]] = Writes[Map[String, Any]](m => Writes.mapWrites[Any](metaValueWriter).writes(m))

  def metaValueReader(jsValue: JsValue): JsResult[Any] = jsValue match {
    case JsObject(m) => JsSuccess(m.map { case (k, v) => k -> metaValueReader(v) })
    case JsArray(arr) => JsSuccess(arr.map(metaValueReader))
    case JsBoolean(b) => JsSuccess(b).map(encryptValue)
    case JsNumber(n) => JsSuccess(n).map(encryptValue)
    case JsString(s) => JsSuccess(s).map(encryptValue)
    case JsNull => JsSuccess("").map(encryptValue)
    case badValue => JsError(s"$badValue is not a valid value")
  }

  def metaValueWriter(value: Any): JsValue = value match {
    case jsRes: JsSuccess[Any] => metaValueWriter(jsRes.get)
    case m: Map[String, Any] => JsObject(m.map { case (k, v) => k -> metaValueWriter(v) })
    case arr: Seq[Any] => JsArray(arr.map(metaValueWriter))
    case s: String => JsString(s)
  }

如何改进此代码?

您事先知道Json数据的结构吗?不,可以是任何嵌套的Json。您事先知道Json数据的结构吗?不,可以是任何嵌套的Json。非常感谢您的提示和有用的建议!非常感谢您的提示和有用的建议!