如何在Scala中正确解析String到Parser [Map [String,Any]]?

时间:2015-02-23 09:34:25

标签: json scala parsing dictionary parser-generator

目前通过“Scala编程,第一版”阅读/工作,特别是第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)时,编译器会拒绝它:

  

JSON.this.type#Parser [Iterable [Any]]类型的表达式没有   符合预期类型JSON.this.type #Parser [Map [String,Any]]

当然,我可以通过将obj的类型更改为Parser [Iterable [Any]]来消除此错误,但这不会产生预期的结果。

这样做的正确方法是什么?

无论价值多少,我都在使用jdk 1.7.0_71和sdk 2.11.5

1 个答案:

答案 0 :(得分:1)

这取决于&#34;成员&#34;的解析器。 我猜你使用的解析器如下:

def member: Parser[Any]

与示例中一样,尝试使用成员解析器:

def member: Parser[(String, Any)] = 
    stringLiteral~":"~value ^^ 
      { case name~":"~value => (name, value) }