【问题标题】:How can I correctly parse a String to Parser[Map[String,Any]] in Scala?如何在 Scala 中正确地将字符串解析为 Parser[Map[String,Any]]?
【发布时间】:2015-02-23 09:34:25
【问题描述】:

目前正在阅读/正在阅读“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

【问题讨论】:

    标签: json scala parsing dictionary parser-generator


    【解决方案1】:

    这取决于“成员”的解析器。 我猜你正在使用像这样的解析器:

    def member: Parser[Any]
    

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

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

    【讨论】:

    • 这修复了它。干杯!
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2021-03-15
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多