如何使用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)
答案 0 :(得分:0)
看一下scala播放库-它支持处理JSON。根据您的描述,读入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.authKey
和parsed.memberAsString
将包含研究的值。