如何使用任意模式解析json,更新/创建一个字段并将其写回json(Scala)

如何使用任意模式解析json,更新/创建一个字段并将其写回json(Scala),json,scala,parsing,Json,Scala,Parsing,如何使用任意模式更新/创建JSON对象中的字段,并在Scala中将其写回JSON 我试着用类似这样的东西来使用spray json: import spray.json._ import DefaultJsonProtocol._ val jsonAst = """{"anyfield":"1234", "sought_optional_field":5.0}""".parse val newValue = jsonAst.asJsObject.fields.getOrElse("sought_

如何使用任意模式更新/创建JSON对象中的字段,并在Scala中将其写回JSON

我试着用类似这样的东西来使用
spray json

import spray.json._
import DefaultJsonProtocol._
val jsonAst = """{"anyfield":"1234", "sought_optional_field":5.0}""".parse
val newValue = jsonAst.asJsObject.fields.getOrElse("sought_optional_field", 1)
val newMap = jsonAst.asJsObject.fields + ("sought_optional_field" -> newValue)
JSONObject(newMap).toJson

但它给出了一个奇怪的结果:{“anyfield”[:“1234”,“seeded\u optional\u field”:]1}

你就快到了:

import spray.json._
import DefaultJsonProtocol._

def changeField(json: String) = {
  val jsonAst = JsonParser(json)
  val map = jsonAst.asJsObject.fields
  val sought = map.getOrElse("sought_optional_field", 1.toJson)
  map.updated("sought_optional_field", sought).toJson
}

val jsonA = """{"anyfield":"1234", "sought_optional_field":5.0}"""
val jsonB = """{"anyfield":"1234"}"""

changeField(jsonA)
// spray.json.JsValue = {"anyfield":"1234","sought_optional_field":5.0}
changeField(jsonB)
// spray.json.JsValue = {"anyfield":"1234","sought_optional_field":1}
使用Argonaut:

import argonaut._, Argonaut._

def changeField2(json: String) =
  json.parseOption.map( parsed =>
    parsed.withObject(o => 
      o + ("sought_optional_field", o("sought_optional_field").getOrElse(jNumber(1)))
    )
  )

changeField2(jsonA).map(_.nospaces)
// Option[String] = Some({"anyfield":"1234","sought_optional_field":5})
changeField2(jsonB).map(_.nospaces)
// Option[String] = Some({"anyfield":"1234","sought_optional_field":1})

我推荐Argonaut。