对net.liftweb.util.JSONParser.parse的结果使用模式匹配

对net.liftweb.util.JSONParser.parse的结果使用模式匹配,json,scala,lift,Json,Scala,Lift,我尝试使用net.liftweb.util.JSONParser解析JSON字符串。它的parse()方法返回一个Box[Any]值,我希望通过模式匹配来处理该值,如下所示: JSONParser.parse("{foo: 'xxx', bar: 'yyy'}") match { case Full(Map) => println("ok") case x => println(x) } 我希望这段代码打印“ok”,但它会打印 Full(Map(f

我尝试使用net.liftweb.util.JSONParser解析JSON字符串。它的parse()方法返回一个Box[Any]值,我希望通过模式匹配来处理该值,如下所示:

JSONParser.parse("{foo: 'xxx', bar: 'yyy'}") match {
        case Full(Map) => println("ok")
        case x => println(x)
}
我希望这段代码打印“ok”,但它会打印

 Full(Map(foo -> xxx, bar -> yyy))
有人知道我的陈述有什么问题吗?

Full(Map)
表示包含单例对象映射的
Full
。如果您希望
Full
中包含某个映射(对象映射不是映射),则该映射应为
Full(m:Map)
(如果您不需要访问该映射,则可以使用
\u而不是
m

更新:

scala> import net.liftweb.util._
import net.liftweb.util._

scala> import net.liftweb.common.Full
import net.liftweb.common.Full

scala> JSONParser.parse("{foo: 'xxx', bar: 'yyy'}") match {
 | case Full(m: Map[_, _]) => println("ok")
 | case x => println(x)
 | }
ok

scala> 
(我忘了地图上的全部内容


我不知道您的要求,但Lift还有一个比JSONParser更强大的json库,它被称为

,感谢您的提示。这完全有道理。我已将case语句更改为case Full(:Map[,])=>println(“ok”)但它仍然与输入不匹配。当我从映射中删除uu时,由于Scala的类型擦除,我得到了一个编译器警告。我忘记了泛型参数,但我很惊讶Full(m:Map[u,u])在Full(m:Map[String,Any])时不起作用。因为它应该做同样的事情(这就是为什么编译器在第二种情况下发出警告,它不检查类型参数).这正是你所做的吗?非常感谢你的帮助。我终于明白了为什么它对我不起作用:我不小心导入了
scala.collection.mutable.Map
,方法是在我的文件中导入
import scala.collection.mutable.\u
。现在是JSONParser.parse()返回的框包含
scala.collecion.immutable.Map
。这就是模式匹配不起作用的原因。这也不起作用,因为JSONParser.parse()返回一个框[Any]。如果该框不是空的,它将包含一个映射。因此我必须以某种方式匹配一个完整的(映射)-不仅仅是一个映射。我的问题更多的是与JSONParser相关的模式匹配。我对JSON解析器没有任何要求,因此我可能可以通过使用另一个解析器来实现它。但我想了解模式匹配。我想知道为什么我的方法不起作用,以及我应该如何做。更新为working代码,你刚错过了你原来比赛的[,]。