如何使用Scala将JSON文件读取到Map中

时间:2018-09-25 16:18:46

标签: scala gatling scala-gatling gatling-jsonpath

如何使用Scala将JSON文件读取到Map中。我一直在尝试实现此目的,但是我正在读取的JSON是嵌套的JSon,因此我还没有找到一种轻松地将JSON提取到键中的方法。 Scala似乎还希望将嵌套的JSON String转换为对象。相反,我希望嵌套的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。这可能吗?有了地图后,我的意图是将键值添加到POST请求标头中,如下所示:

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

2 个答案:

答案 0 :(得分:0)

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

Scala Play - JSON

答案 1 :(得分:0)

由于该问题被标记为“加特林”,因此在后台,此库依赖于Jackson / fasterxml进行JSON处理,因此我们可以使用它。

无法直接以String的形式检索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将包含研究的值。