如何在 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) }