如何使用Scala将JSON文件读入映射

如何使用Scala将JSON文件读入映射,scala,gatling,jsonpath,Scala,Gatling,Jsonpath,如何使用Scala将JSON文件读入地图。我一直在尝试实现这一点,但我正在阅读的JSON是嵌套JSON,因此我没有找到一种方法轻松地将JSON提取到键中。Scala似乎也希望将嵌套的JSON字符串转换为对象。相反,我希望嵌套的JSON作为字符串“value”。我希望有人能澄清或给我一个提示,我可能会这样做 我的JSON源代码可能如下所示: { "authKey": "34534645645653455454363", "member": { "memberId": "whatev

如何使用Scala将JSON文件读入地图。我一直在尝试实现这一点,但我正在阅读的JSON是嵌套JSON,因此我没有找到一种方法轻松地将JSON提取到键中。Scala似乎也希望将嵌套的JSON字符串转换为对象。相反,我希望嵌套的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提取到一个包含两个键的映射中,而不必钻取嵌套的JSON。这可能吗?一旦我有了映射,我的意图就是将键值添加到我的POST请求头中,如下所示:

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并从任何所需节点获取字符串值应该非常简单


由于问题被标记为“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.authKey
parsed.memberAsString
将包含所研究的值。

这是否意味着您只对一级键感兴趣?是的,只对一级键感兴趣。所以,我希望第一级值是字符串,而不是json/object。在gatlinglibs文件夹中,没有jackson模块scala依赖项的jar。我假设这就是获得com.fasterxml.jackson.module.scala包的方法?您需要在build.sbt中添加依赖项。谢谢您的回答。此外,gatling似乎有一个内置的用于读取Json的“Feeder”。我需要调查,我不想使用游戏库。如果我想导入一个库,我会安装json.simple或Groovy all来获取json slurper。