如何将json字符串转换为scalaMap?

6tqwzwtp  于 2022-11-26  发布在  Scala
关注(0)|答案(2)|浏览(154)

我有一个嵌套的json,它的结构还没有定义。每次我运行的时候它都是不同的,因为我是从一个远程文件中阅读的。我需要将这个json转换成Map[String, Any]类型的map。我试着研究json4s和Jackson解析器,但是它们似乎没有解决我的这个问题。有人知道我怎么才能做到这一点吗?
示例字符串:

{"body":{
    "method":"string",
    "events":"string",
    "clients":"string",
    "parameter":"string",
    "channel":"string",
    "metadata":{
        "meta1":"string",
        "meta2":"string",
        "meta3":"string"
    }
},
"timestamp":"string"}

巢状层次可以是任意的,也可以不预先定义。
为帮助使用案例:
我有一个Map[String,Any],我需要将它存储在一个文件中作为备份。所以我将它转换为一个json字符串并将其存储在一个文件中。现在每次我得到新数据时,我都需要从文件中获取json,将其再次转换为Map并执行一些计算。我不能将Map存储在内存中,因为如果我的作业失败,我会丢失它。
我需要一个解决方案,将json字符串转换回原来的Map,我有之前,我转换它。

e5njpo68

e5njpo681#

我在json4s 3.2.11中尝试了以下方法,结果成功了:

import org.json4s._
import org.json4s.jackson.JsonMethods._

//...
def jsonStrToMap(jsonStr: String): Map[String, Any] = {
  implicit val formats = org.json4s.DefaultFormats

  parse(jsonStr).extract[Map[String, Any]]
}

也许你没有定义Formats类型的implicit val?还要注意,你不需要在every和each方法中有implicit val,只要它在作用域中是 * findable * 的。

ej83mcc0

ej83mcc02#

可以使用以下代码将JSON字符串解析为Map[String, Any]

import org.json4s._ 
import org.json4s.jackson.JsonMethods._

val jsonMap = parse(jsonString).values.asInstanceOf[Map[String, Any]]

但是,这不是类型安全的,因此在从Map中提取值时应谨慎使用。

相关问题