如何使用 Scala 将 JSON 文件读入地图

How to read a JSON file into a Map, using Scala

如何使用 Scala 将 JSON 文件读入地图。我一直在尝试完成此操作,但我正在阅读的 JSON 是嵌套的 JSon,因此我还没有找到一种方法可以轻松地将 JSON 提取到键中。 Scala 似乎还想将嵌套的 JSON 字符串转换为 object。相反,我希望嵌套的 JSON 作为字符串 "value"。我希望有人可以澄清或提示我如何做到这一点。

我的 JSON 来源可能是这样的:

{
  "authKey": "34534645645653455454363",
  "member": {
    "memberId": "whatever",
    "firstName": "Jon",
    "lastName": "Doe",
    "address": {
      "line1": "Whatever Rd",
      "city": "White Salmon",
      "state": "WA",
      "zip": "98672"
    },
    "anotherProp": "wahtever",
  }
}

我想将这个 JSON 提取到 2 个键的 Map 中,而无需钻入嵌套的 JSON。这可能吗?获得地图后,我打算将 key-values 添加到我的 POST 请求 headers,如下所示:

val sentHeaders = Map("Content-Type" -> "application/javascript", 
   "Accept" -> "text/html", "authKey" -> extractedValue,
   "member" -> theMemberInfoAsStringJson)
http("Custom headers")
.post("myUrl")
.headers(sentHeaders)

查看 scala play 库 - 它支持处理 JSON。根据您的描述,读取 JSON 并从任何所需节点获取字符串值应该非常简单。

Scala Play - JSON

由于问题被标记为 'gatling',在幕后这个库依赖于 Jackson/fasterxml 进行 JSON 处理,所以我们可以利用它。

无法直接将 JSON 的嵌套结构化部分作为 String 检索,但只需很少的额外代码,仍然可以实现结果。

所以,输入 JSON:

val json = """{
             |  "authKey": "34534645645653455454363",
             |  "member": {
             |    "memberId": "whatever",
             |    "firstName": "Jon",
             |    "lastName": "Doe",
             |    "address": {
             |      "line1": "Whatever Rd",
             |      "city": "White Salmon",
             |      "state": "WA",
             |      "zip": "98672"
             |    },
             |    "anotherProp": "wahtever"
             |  }
             |}""".stripMargin

可以创建和配置 Jackson 的 ObjectMapper 以在 Scala 中使用:

// import com.fasterxml.jackson.module.scala.DefaultScalaModule

val mapper = new ObjectMapper().registerModule(DefaultScalaModule)

为了轻松解析输入 json,专用案例 class 很有用:

case class SrcJson(authKey: String, member: Any) {
  val memberAsString = mapper.writeValueAsString(member)
}

我们还在其中包含val memberAsString,它将包含我们的目标JSON字符串,通过最初解析的member反向转换获得,实际上是Map .

现在,解析输入 json:

val parsed = mapper.readValue(json, classOf[SrcJson])

参考文献 parsed.authKeyparsed.memberAsString 将包含研究值。