如何在 Scala 中将 String 正确解析为 Parser[Map[String,Any]]?
How can I correctly parse a String to Parser[Map[String,Any]] in Scala?
目前正在阅读/学习 "Programming in Scala, First Edition",特别是第 31 章:Combinator Parsing
作者正在描述如何解析 JSON 文件并提供以下更高级的转换:
def obj: Parser[Map[String, Any]] = // Can be improved
"{"~repsep(member, ",")~"}" ^^
{ case "{"~ms~"}" => Map() ++ ms }
后来改进为:
def obj: Parser[Map[String, Any]] =
"{"~> repsep(member, ",") <~"}" ^^ (Map() ++ _)
但是,当我将此类代码输入 IDE(IntelliJ IDEA 14.03)时,编译器会拒绝它:
Expression of type JSON.this.type#Parser[Iterable[Any]] doesn't
conform to expected type JSON.this.type#Parser[Map[String,Any]]
当然,我可以通过将 obj 的类型更改为 Parser[Iterable[Any]] 来消除此错误,但这不会给出所需的结果。
正确的做法是什么?
无论它值多少钱,我都在使用 jdk 1.7.0_71 和 sdk 2.11.5
这取决于 "member" 的解析器。
我猜你正在使用像这样的解析器:
def member: Parser[Any]
像例子一样,尝试使用成员解析器:
def member: Parser[(String, Any)] =
stringLiteral~":"~value ^^
{ case name~":"~value => (name, value) }
目前正在阅读/学习 "Programming in Scala, First Edition",特别是第 31 章:Combinator Parsing
作者正在描述如何解析 JSON 文件并提供以下更高级的转换:
def obj: Parser[Map[String, Any]] = // Can be improved
"{"~repsep(member, ",")~"}" ^^
{ case "{"~ms~"}" => Map() ++ ms }
后来改进为:
def obj: Parser[Map[String, Any]] =
"{"~> repsep(member, ",") <~"}" ^^ (Map() ++ _)
但是,当我将此类代码输入 IDE(IntelliJ IDEA 14.03)时,编译器会拒绝它:
Expression of type JSON.this.type#Parser[Iterable[Any]] doesn't conform to expected type JSON.this.type#Parser[Map[String,Any]]
当然,我可以通过将 obj 的类型更改为 Parser[Iterable[Any]] 来消除此错误,但这不会给出所需的结果。
正确的做法是什么?
无论它值多少钱,我都在使用 jdk 1.7.0_71 和 sdk 2.11.5
这取决于 "member" 的解析器。 我猜你正在使用像这样的解析器:
def member: Parser[Any]
像例子一样,尝试使用成员解析器:
def member: Parser[(String, Any)] =
stringLiteral~":"~value ^^
{ case name~":"~value => (name, value) }