/ / Comment analyser json avec un schéma arbitraire, mettre à jour / créer un champ et l'écrire sous le nom json (Scala) - json, scala, analyser

Comment analyser json avec un schéma arbitraire, mettre à jour / créer un champ et le réécrire comme json (Scala) - json, scala, parsing

comment mettre à jour / créer un champ dans un objet JSON avec arbitraire schéma et le réécrire en tant que JSON dans Scala?

J'ai essayé avec spray-json avec quelque chose comme ça:

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

mais cela donne un résultat étrange: "{"anyfield"[ : "1234", "sought_optional_field" : ]1}

Réponses:

1 pour la réponse № 1

Vous étiez presque là:

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}

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