1
 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。还有其他方法还是我错过了什么?

4

1 回答 1

0

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

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

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

第二个选项是将变量提取到案例类中,让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,这在第一个选项中更难。

于 2020-07-28T16:15:34.300 回答