从任何Json更新所有值
我有一些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” }"""从任何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
如何操作?将其解析为
映射
,然后遍历映射并加密:
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。非常感谢您的提示和有用的建议!非常感谢您的提示和有用的建议!