【问题标题】:How to read a JSON file into a Map, using Scala如何使用 Scala 将 JSON 文件读入地图
【发布时间】:2019-03-01 08:10:51
【问题描述】:

如何使用 Scala 将 JSON 文件读入 Map。我一直在尝试实现这一点,但我正在阅读的 JSON 是嵌套的 JSon,因此我还没有找到一种方法可以轻松地将 JSON 提取到密钥中。 Scala 似乎也想将嵌套的 JSON 字符串转换为对象。相反,我希望将嵌套的 JSON 作为字符串“值”。我希望有人能澄清或提示我如何做到这一点。

我的 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 中。这可能吗?有了 Map 后,我的意图是将键值添加到我的 POST 请求标头中,如下所示:

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

【问题讨论】:

  • 是不是只对一级键感兴趣?
  • 是的,仅限一级密钥。所以,我希望 1 级值作为字符串,而不是 json/object。

标签: scala gatling jsonpath


【解决方案1】:

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

Scala Play - JSON

【讨论】:

  • 我不想使用 Play 库。如果我想导入一个库,我会安装 json.simple 或 Groovy-all 来获取 json-slurper。
【解决方案2】:

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

无法直接将 JSON 的嵌套结构化部分检索为字符串,但只需很少的附加代码,仍然可以实现结果。

所以,输入 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,一个专用的 case 类很有用:

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 将包含研究值。

【讨论】:

  • 我需要在 Gatling 项目的上下文中执行此操作。在 gatling libs 文件夹中,没有用于 jackson-module-scala 依赖项的 jar。我假设这就是您获得 com.fasterxml.jackson.module.scala 包的方式?
  • 你需要在 build.sbt 中添加依赖。
  • 感谢您的回答。此外,gatling 似乎有一个内置的用于读取 Json 的功能,称为“Feeder”。我需要调查。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2017-01-18
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多