2011-09-03 2 views
2

Я пытаюсь разобрать строку JSON с помощью net.liftweb.util.JSONParser. Это метод синтаксического анализа() возвращает окно [Any] значение, которое я хочу обработать с помощью сопоставления с образцом, как это:Использование сопоставления с результатом net.liftweb.util.JSONParser.parse

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

Я бы ожидать, этот код, чтобы напечатать «ОК», но вместо этого она печатает

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> 

(я забыл (Full) вокруг карты [,]

Я не знаю ваших требований, но Lift также имеет библиотеку другой JSon, который является более мощным, чем JSONParser, его называется lift-json

+0

Это не работает ни потому, что JSONParser.parse() возвращает поле [Any]. Если это поле не пустое, оно будет содержать карту. Поэтому мне нужно как-то сопоставить Full (Карта) - не просто карту. Мой вопрос больше связан с шаблоном, сопоставляемым с JSONParser. У меня нет требований к парсеру JSON, поэтому я мог бы заставить его работать, используя другой. Но я хочу понять соответствие шаблонов. Я хочу знать, почему мой подход не работает и как я должен это делать. – Michael

+0

Обновленный с помощью рабочего кода, вы просто пропустили [_, _] из своего исходного матча. – fmpwizard

2

Full(Map) означает a Full, содержащий одноэлементный номер object Map. Если вы хотите Full с чем-то внутри, что это карта (объект Map не один), он должен быть Full(m: Map) (вы можете использовать _ вместо m, если вам не нужен доступ к этой карте)

+0

Спасибо четыре вашего намека. Это создает общий смысл. Я изменил регистр дела на case Full (_: Map [_, _]) => println ("ok") , но он все еще не соответствует вводу. Когда я удаляю _ с карты, я получаю предупреждение о компиляторе из-за стирания типа Scala. – Michael

+0

Я забыл общий параметр, но я удивлен, что Full (m: Map [_, _]) не работает, когда Full (m: Map [String, Any]). Поскольку он должен делать то же самое (поэтому компилятор предупреждает во втором случае, он не проверяет параметры типа). Это именно то, что вы сделали? –

+0

Большое спасибо за помощь. Я, наконец, понял, почему это не работает для меня: я случайно импортировал 'scala.collection.mutable.Map', имея' import scala.collection.mutable._' в моем файле. Теперь поле, которое возвращается JSONParser.parse(), содержит 'scala.collecion.immutable.Map'. Вот почему совпадение шаблонов не сработало. – Michael

Смежные вопросы