【问题标题】:How to Parse Json Object and use its variables in scala如何解析 Json 对象并在 scala 中使用其变量
【发布时间】:2015-04-24 09:17:11
【问题描述】:

如果返回的 Json 字符串是这样的,我如何获取 access Token 的值:

var result = Http("https://example.com").postForm(Seq("clientId" -> clientId, "clientSecret" -> clientSecret)).asString

var jsonObj = scala.util.parsing.json.JSON.parseFull(result.
accessToken = jsonObj.get("accessToken")

对example.com的请求结果是:

{
    "accessToken": "xxyyyzzz",
    "expiresIn": 3600
}

【问题讨论】:

  • 您有什么问题吗...我认为这段代码应该可以正常工作...考虑到您更改了最后一行,因为scala.util.parsing.json.JSON.parseFull( result ) 返回Option[ Any ]
  • 我得到编译错误:任何不带参数

标签: json scala http servlets


【解决方案1】:

基本上,scala.util.parsing.json.JSON.parseFull 返回Option[ Any ]

Any 因为返回类型取决于 JSON 输入的结构。

Option 因为您的 JSON 字符串可能是错误的,因此在出现错误时使用 None,在成功时使用 Some[ Any ]

所以...在这种情况下,您的 JSON 是,

{
    "accessToken": "xxyyyzzz",
    "expiresIn": 3600
}

这显然是一个 Map 类型的东西。所以...在这种情况下,返回类型将是 Option[ Map[ String, Any] ] 的实例,但会被 Option[ Any ] 类型的变量引用。

所以...你要做的就是跟随,

val optionAny = scala.util.parsing.json.JSON.parseFull( result )

val accessToken = optionAny match {
    case None => ""
    case Some( mapAsAny ) => mapAsAny match {
        case m: Map[ String, Any ] => {
            // Map[ A, B].get( key: A ) returns Option[ B ]
            // So here m.get( "accessToken" ) Will return Option[ Any ]
            val optionToken = m.get( "accessToken" )
            optionToken match {
                case None =>  ""
                case Some( strAsAny ) => strAsAny match {
                    case str: String => str
                    case _ => ""
                }
            }
        }
        case _ => ""
    }
}

【讨论】:

  • 我现在收到错误消息:“缺少扩展函数的参数类型 [错误] 必须完全知道匿名函数的参数类型。(SLS 8.5)[错误] 预期类型是:?[错误] case Some(mapAsAny) => {"
  • 哦...我在代码中犯了一个错误。现在修好了。将此 - case Some( mapAsAny ) => { 更改为 case Some( mapAsAny ) => mapAsAny match {
  • 虽然如果您控制服务器代码,这是一个很好的答案,那么您应该考虑使用像 Argonaut 这样的东西,它会查看您的 Scala 案例类并自动转换为 json 和从 json 转换。请参阅此答案,它仅使用两行代码即可无缝处理结构化 json/对象,要求它创建映射stackoverflow.com/a/18675897/329496
  • 虽然 Argonaut 很棒...我会更多地推荐其他库(只是因为有更好的文档和教程),例如 - Gson、Jackson 或 PlayJson。
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多