Scala编辑Json对象并写入一个新的Json对象



我在scala中有一个json字符串它看起来像这样

"""
{
"input": {
"House" :{
"Tile" : "Ceramic"
"Kitchen" : {
"Sink" : "Stainless-Steel"
"Counter-Top" : "Granite"
}
}
}
}
"""

我使用json4s来解析它并将其放入Map中然后我将其设置为可变的,以便我可以编辑它,但我不知道如何获取并修改它以使其成为一个新的json对象

import org.json4s.jackson.JsonMethods._
import org.json4s._
import org.json4s.native.Serialization._
import org.json4s.native.Serialization
import scala.collection.mutable
...
val reqJsonMap = parse(reqJson).extract[Map[String,Any]]
val reqJsonMutableMap= collection.mutable.Map[String,Any]()
reqJsonMutableMap ++=reqJsonMap

我想做的是我想编辑它,并使json的瓷砖=大理石和厨房的关键更改为浴室

我只是不知道如何把那个对象变成这个

"""
{
"input": {
"House" :{
"Tile" : "Marble"
"Bathroom" : {
"Sink" : "Stainless-Steel"
"Counter-Top" : "Granite"
}
}
}
}
"""

我认为使用case classes比使用JSON要好得多。我认为这是最方便的使用Json解析库,如circe来解析你的Json字符串到一个case类,然后做任何你需要做的事情:

import io.circe._, io.circe.generic.auto._, io.circe.syntax._, io.circe.parser._
val myJsonString = """
{
"input": {
"house" :{
"tile" : "Ceramic",
"kitchen" : {
"sink" : "Stainless-Steel",
"counterTop" : "Granite"
}
}
}
}
"""
case class Data(input: Input)
case class Input(house: HouseInfo)
case class HouseInfo(tile: String, kitchen: KitchenInfo)
case class KitchenInfo(sink: String, counterTop: String)
val maybeDataJsonObject = parse(myJsonString)
val maybeData = maybeDataJsonObject match {
case Right(dataJsonObject) => dataJsonObject.as[Data]
case Left(failure)         => println(failure)
}
maybeData match {
case Right(data) => println(data)
case Left(failure) => println(failure)
}
顺便说一下,json的格式不是很好,因为您将字段名称的首字母大写,而这些名称通常应该是小写的。另外,你把它写成Counter-Top,而不是我们说的counterTop,-字符在Scala的字段名中会有问题。

为了应用您正在寻找的转换,您需要编写具有所需字段名称的新case类,然后您可以编写一个转换器函数将获得的Data对象转换为TransformedData对象。然后,您可以使用circe通过在Json中编码case类来获得一个新的Json字符串,如下所示:

val transformedJsonString = myTransformedData.asJson.toString

最新更新