【问题标题】:How to convert response body in Json using play framework如何使用播放框架在 Json 中转换响应体
【发布时间】:2020-11-17 02:09:28
【问题描述】:
 override def accessToken(): ServiceCall[RequestTokenLogIn, Done] = {
request=>
  val a=request.oauth_token.get
  val b=request.oauth_verifier.get
  val url=s"https://api.twitter.com/oauth/access_token?oauth_token=$a&oauth_verifier=$b"
  ws.url(url).withMethod("POST").get().map{
    res=>
   println(res.body)
  }

我在终端上得到的输出是
oauth_token=xxxxxxxxx&oauth_token_secret=xxxxxxx&user_id=xxxxxxxxx&screen_name=xxxxx

我想把这个响应转换成json格式.like

{
oauth_token:"",
token_secret:"",
}

当调用res.json.toString 时,它不会转换为 jsValue。 还有其他方法还是我错过了什么?

【问题讨论】:

标签: json scala twitter playframework ws-client


【解决方案1】:

根据documentation twitter 发布的消息,似乎响应不是有效的json。因此,您不能自动转换它。 在我看来,您有 2 个选项,您不会喜欢的。在这两个选项中,您都必须进行字符串操作。

我不太喜欢的第一个选项实际上是构建 json:

print(s"""{ \n\t"${res.body.replace("=", "\": \"").replace("&", "\"\n\t\"")}" \n}""")

第二种选择,将变量提取到一个case类中,让play-json为你构建json字符串:

case class TwitterAuthToken(oauth_token: String, oauth_token_secret: String, user_id: Long, screen_name: String)
object TwitterAuthToken {
  implicit val format: OFormat[TwitterAuthToken] = Json.format[TwitterAuthToken]
}
 
val splitResponse = res.body.split('&').map(_.split('=')).map(pair => (pair(0), pair(1))).toMap
val twitterAuthToken = TwitterAuthToken(
  oauth_token = splitResponse("oauth_token"),
  oauth_token_secret = splitResponse("oauth_token_secret"),
  user_id = splitResponse("user_id").toLong,
  screen_name = splitResponse("screen_name")
)

print(Json.toJsObject(twitterAuthToken))

我会注意到 Json.toJsObject(twitterAuthToken) 返回 JsObject,您可以对其进行序列化和反序列化。

我不熟悉任何修改被 play-json 解析的 json 分隔符的选项。给定一个现有的 json,您可以操作从 json 到案例类的路径。但这不是您想要的。

我不确定是否需要,但在第二个选项中,您可以将 user_id 定义为 long,这在第一个选项中更难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多