【问题标题】:Scala Edit Json Object and Write To a New Json ObjectScala 编辑 Json 对象并写入新的 Json 对象
【发布时间】:2021-10-26 23:42:01
【问题描述】:

所以我在 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

我想做的是编辑它并制作 Tile=Marble 的 json 并将 Kitchen 的键更改为浴室

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

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

【问题讨论】:

    标签: json scala


    【解决方案1】:

    我认为与case classes 合作比与JSON 合作要好得多。我觉得用circe之类的Json解析库把你的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 中的字段名称中会出现问题。

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

    val transformedJsonString = myTransformedData.asJson.toString
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2011-08-23
      • 2021-11-27
      • 2019-02-24
      相关资源
      最近更新 更多