如何使用 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 并从任何所需节点获取字符串值应该非常简单。
由于问题被标记为 '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.authKey
和 parsed.memberAsString
将包含研究值。
如何使用 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 并从任何所需节点获取字符串值应该非常简单。
由于问题被标记为 '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.authKey
和 parsed.memberAsString
将包含研究值。