json 路径的 json4s 更新 json 值
update json values with json4s for a json path
我想更新 Json 中的 json 值。我尝试使用转换字段和替换方法,但每个方法都有一个问题阻止我继续。所以我正在寻求帮助。我必须创建一个方法,该方法采用 Map 参数列表,该 Map 中的键对应于 Json 路径,值是要更新的值,例如:
def jsonFieldUpdater( SeaarchKey : List(Map(key, VALUE ) )
所以在地图中我有一个 Json 路径
[\inner\age, 30 ] 作为键;我的方法读取它并更新该字段而不是所有年龄键。见下面的例子
{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http://www.nosqlnocry.wordpress.com"}
我有点卡在这里,好像我使用 Use transformfield 方法更新所有具有年龄键的值,我不希望我想转到特定路径并转换它。我的代码块是:
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
object Json4sTest {
def main(arg: Array[String]) {
//val source = scala.io.Source.fromFile("file.txt")
//val lines = try source.mkString finally source.close()
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http:// www.nosqlnocry.wordpress.com"}""")
println(pretty(json))
//JObject(List(JField("foo", JObject(List(JField("bar", JInt(1))))))).replace("foo" :: "bar" :: Nil, JString("baz"))
json = json.replace("inner" :: "age" :: Nil, 29)
json = json transformField {
case ("name", _) => ("NAME", JString("Tuca"))
case ("age", JInt(age)) => ("age", JInt(age+1))
//case ("checkIn", date) => ("checkIn", JString(df.print(now.plusDays(deltaIn))))
}
println(pretty(json))
}
}
我遇到了执行替换值任务的替换方法。但它看起来像这样:
json = json.replace("inner" :: "age" :: 无, 29)
当我刚收到一个具有 Json 路径和必须更新的值的地图时,我无法思考如何符合这种格式。还有其他实现相同目标的想法吗?
我尝试了 n4to4 的解决方案,但是当我将映射列表分配给变量时,我得到了错误,例如:
val a = List(Map("inner/age" -> 35, "age" -> 27, "name" -> "foo"))
jsonFieldUpdater(json, a )
// error : type mismatch; found : List[scala.collection.immutable.Map[String,Any]] required: List[Map[String,org.json4s.JValue]] (which expands to) List[Map[String,org.json4s.JsonAST.JValue]]
不一定是 List
的 Map
可能...?
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
object Json4sTest {
def main(arg: Array[String]) {
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http:// www.nosqlnocry.wordpress.com"}""")
println(pretty(json))
val a: List[Map[String, JValue]] = List(Map("inner/age" -> 35, "age" -> 27), Map("name" -> "foo"))
val r = jsonFieldUpdater(json, a)
println(pretty(r))
val b = List(Updater("inner/age", 35), Updater("age", 27), Updater("name", "foo"))
val s = jsonFieldUpdater2(json, b)
println(pretty(s))
}
def jsonFieldUpdater(json: JValue, list: List[Map[String, JValue]]): JValue =
list.foldLeft(json) { case (json, kvs) =>
kvs.foldLeft(json) { case (json, (key, value)) =>
json.replace(key.split("/").toList, value)
}
}
case class Updater(key: String, value: JValue) {
def path: List[String] = key.split("/").toList
}
def jsonFieldUpdater2(json: JValue, list: List[Updater]): JValue =
list.foldLeft(json) { case (json, u) =>
json.replace(u.path, u.value)
}
}
你可以试试下面的代码来更新字段
import org.json4s.JValue
import org.json4s.JsonAST.JObject
import org.json4s.jackson.JsonMethods._
val msgJson = "{\"outer\":\"before\",\"inner\": { \"age\": 1 }}"
val msgJValue: JValue = parse(msgJson)
val mergeJValue = msgJValue merge JObject(
List(
("outer", JString("after")),
("inner", JObject(List(("age", JInt(100)))))
)
)
println(compact(render(mergeJValue)))//{"outer":"after","inner":{"age":100}}
怎么样
json.replace(path.split("/").toList,myNewJvalue)
我想更新 Json 中的 json 值。我尝试使用转换字段和替换方法,但每个方法都有一个问题阻止我继续。所以我正在寻求帮助。我必须创建一个方法,该方法采用 Map 参数列表,该 Map 中的键对应于 Json 路径,值是要更新的值,例如:
def jsonFieldUpdater( SeaarchKey : List(Map(key, VALUE ) )
所以在地图中我有一个 Json 路径 [\inner\age, 30 ] 作为键;我的方法读取它并更新该字段而不是所有年龄键。见下面的例子
{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http://www.nosqlnocry.wordpress.com"}
我有点卡在这里,好像我使用 Use transformfield 方法更新所有具有年龄键的值,我不希望我想转到特定路径并转换它。我的代码块是:
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
object Json4sTest {
def main(arg: Array[String]) {
//val source = scala.io.Source.fromFile("file.txt")
//val lines = try source.mkString finally source.close()
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http:// www.nosqlnocry.wordpress.com"}""")
println(pretty(json))
//JObject(List(JField("foo", JObject(List(JField("bar", JInt(1))))))).replace("foo" :: "bar" :: Nil, JString("baz"))
json = json.replace("inner" :: "age" :: Nil, 29)
json = json transformField {
case ("name", _) => ("NAME", JString("Tuca"))
case ("age", JInt(age)) => ("age", JInt(age+1))
//case ("checkIn", date) => ("checkIn", JString(df.print(now.plusDays(deltaIn))))
}
println(pretty(json))
}
}
我遇到了执行替换值任务的替换方法。但它看起来像这样: json = json.replace("inner" :: "age" :: 无, 29) 当我刚收到一个具有 Json 路径和必须更新的值的地图时,我无法思考如何符合这种格式。还有其他实现相同目标的想法吗?
我尝试了 n4to4 的解决方案,但是当我将映射列表分配给变量时,我得到了错误,例如:
val a = List(Map("inner/age" -> 35, "age" -> 27, "name" -> "foo"))
jsonFieldUpdater(json, a )
// error : type mismatch; found : List[scala.collection.immutable.Map[String,Any]] required: List[Map[String,org.json4s.JValue]] (which expands to) List[Map[String,org.json4s.JsonAST.JValue]]
不一定是 List
的 Map
可能...?
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
object Json4sTest {
def main(arg: Array[String]) {
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http:// www.nosqlnocry.wordpress.com"}""")
println(pretty(json))
val a: List[Map[String, JValue]] = List(Map("inner/age" -> 35, "age" -> 27), Map("name" -> "foo"))
val r = jsonFieldUpdater(json, a)
println(pretty(r))
val b = List(Updater("inner/age", 35), Updater("age", 27), Updater("name", "foo"))
val s = jsonFieldUpdater2(json, b)
println(pretty(s))
}
def jsonFieldUpdater(json: JValue, list: List[Map[String, JValue]]): JValue =
list.foldLeft(json) { case (json, kvs) =>
kvs.foldLeft(json) { case (json, (key, value)) =>
json.replace(key.split("/").toList, value)
}
}
case class Updater(key: String, value: JValue) {
def path: List[String] = key.split("/").toList
}
def jsonFieldUpdater2(json: JValue, list: List[Updater]): JValue =
list.foldLeft(json) { case (json, u) =>
json.replace(u.path, u.value)
}
}
你可以试试下面的代码来更新字段
import org.json4s.JValue
import org.json4s.JsonAST.JObject
import org.json4s.jackson.JsonMethods._
val msgJson = "{\"outer\":\"before\",\"inner\": { \"age\": 1 }}"
val msgJValue: JValue = parse(msgJson)
val mergeJValue = msgJValue merge JObject(
List(
("outer", JString("after")),
("inner", JObject(List(("age", JInt(100)))))
)
)
println(compact(render(mergeJValue)))//{"outer":"after","inner":{"age":100}}
怎么样
json.replace(path.split("/").toList,myNewJvalue)