使用json4s为json路径更新json值

时间:2016-09-07 19:50:34

标签: scala json4s

我想在我的Json中更新json值。我尝试使用转换字段和替换方法,但每个都有一个问题,阻止我继续。所以我正在寻求帮助。我必须创建一个方法,该方法采用Map of Map参数,该Map中的Key对应于Json Path,值为要更新的值,例如:

def jsonFieldUpdater( SeaarchKey :  List(Map(key, VALUE ) )

所以在地图中我有一个Json Path  [\ inner \ age,30]作为一把钥匙;我的方法读取它并更新该字段而不是所有年龄键。见下面的例子

{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http://www.nosqlnocry.wordpress.com"}

我有点卡在这里,好像我使用使用变换域方法更新所有具有密钥作为年龄的值,我不希望我想去特定路径并转换它。我的代码块是:

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”:: Nil,29) 当我刚收到一张有Json路径和必须更新的值的地图时,我无法想到如何符合这种格式。有没有其他想法实现同样的目标?

我尝试了n4to4的解决方案但是当我将Map的Map分配给变量时我得到了错误,例如:

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]]

2 个答案:

答案 0 :(得分:2)

它可能不一定是List的{​​{1}} ......?

Map

答案 1 :(得分:0)

您可以尝试以下代码来更新字段

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}}