轻松地将Key = Value对的字符串解析为Scala案例类

Ant*_*ick 7 parsing scala key-value case-class

有没有办法轻松地将一串键值对解析成scala案例类?

例如,来自以下字符串

"consumer_key=1234ABC, consumer_secret=12345ABC"
Run Code Online (Sandbox Code Playgroud)

case class Auth(consumerKey: String, consumerSecret: String)
Run Code Online (Sandbox Code Playgroud)

甚至

"consumer_key=1234ABC, consumer_secret=12345ABC"
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 10

您可以使用正则表达式和模式匹配:

scala> val R = "consumer_key=(.*), consumer_secret=(.*)".r
R: scala.util.matching.Regex = consumer_key=(.*), consumer_secret=(.*)

scala> "consumer_key=1234ABC, consumer_secret=12345ABC" match {
     |   case R(k, v) => Auth(k, v)
     | }
res0: Auth = Auth(1234ABC,12345ABC)
Run Code Online (Sandbox Code Playgroud)

使用JavaTokenParsers更灵活的解析:

import scala.util.parsing.combinator._

case class Auth( consumerKey: String, consumerSecret: Option[String])

class AuthParser extends JavaTokenParsers {
  def auth: Parser[Auth] = key ~ opt("," ~> secret) ^^ { case k ~ s => Auth(k, s)}
  def key: Parser[String] = value("consumer_key")
  def secret: Parser[String] = value("consumer_secret")
  def value(k: String): Parser[String] = k ~ "=" ~> "[^,]*".r
  def apply(s: String) = parseAll(auth, s)
}
Run Code Online (Sandbox Code Playgroud)

用法:

scala> val p = new AuthParser
p: AuthParser = AuthParser@433b9799

scala> p("consumer_key=1234ABC, consumer_secret=12345ABC").get
res0: Auth = Auth(1234ABC,Some(12345ABC))

scala> p("consumer_key=1234ABC").get
res1: Auth = Auth(1234ABC,None)
Run Code Online (Sandbox Code Playgroud)