2011-09-03 68 views
2

我尝试使用net.liftweb.util.JSONParser解析JSON字符串。这是parse()方法返回一个框,我想通过模式匹配这样的处理[任意值:使用模式匹配net.liftweb.util.JSONParser.parse的结果

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

我预计这段代码打印“OK”,而是它打印

Full(Map(foo -> xxx, bar -> yyy)) 

有没有人有一个想法我的声明有什么问题?

回答

1

更新:

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> 

(我忘了全()周围的地图[]

我不知道你的要求,同时也提起有另一个JSON库比JSONParser更强大,它被称为lift-json

+0

这不起作用,因为JSONParser.parse()返回一个Box [Any]。如果该Box不是空的,它将包含一个Map。所以我必须以某种方式匹配完整(地图) - 不只是一个地图。 我的问题更多地涉及到与JSONParser匹配的模式。 我对JSON解析器没有任何要求,所以我可以通过使用另一个解析器来使其工作。 但我想了解模式匹配。我想知道为什么我的方法不起作用,我应该怎么做。 – Michael

+0

已更新为工作代码,您刚刚从原始匹配中遗漏了[_,_]。 – fmpwizard

2

Full(Map)表示包含单身人士object MapFull。如果你想用Full里面的东西是一个地图(对象地图是不是一个),它应该是Full(m: Map)(你可以使用_,而不是m,如果你不需要访问该地图)

+0

谢谢你的提示。这是完全合理的。 我已将case case语句更改为 case Full(_:Map [_,_])=> println(“ok”) 但它仍与输入不匹配。当我从Map中删除_时,由于Scala的类型擦除,我得到一个编译器警告。 – Michael

+0

我忘记了泛型参数,但当Full(m:Map [String,Any])完成时,Full(m:Map [_,_])不起作用,我很惊讶。因为它应该做同样的事情(这就是编译器在第二种情况下发出警告的原因,所以它不检查类型参数)。这正是你所做的吗? –

+0

非常感谢您的帮助。我终于明白为什么它不适合我:我通过在我的文件中导入scala.collection.mutable._',意外地导入了'scala.collection.mutable.Map'。现在由JSONParser.parse()返回的Box包含'scala.collecion.immutable.Map'。这就是为什么模式匹配不起作用。 – Michael