коллекция траверсов типа "Any" в Scala - PullRequest
3 голосов
/ 26 октября 2010

Я хотел бы просмотреть коллекцию, полученную из инструментария Scala JSON на github. Проблема в том, что JsonParser возвращает «Any», поэтому мне интересно, как мне избежать следующей ошибки:

«Значение foreach не является членом Any».

val json = Json.parse(urls)

for(l <- json) {...}

object Json {
  def parse(s: String): Any = (new JsonParser).parse(s)
}

Ответы [ 3 ]

6 голосов
/ 26 октября 2010

Вам нужно будет выполнить сопоставление с образцом, чтобы обойти структуры, возвращаемые синтаксическим анализатором.

/*
 * (untested)
 */
def printThem(a: Any) {
  a match {
    case l:List[_] => 
      println("List:")
      l foreach printThem
    case m:Map[_, _] =>
      for ( (k,v) <- m ) {
        print("%s -> " format k)
        printThem(v)
      }
    case x => 
      println(x)
  }
val json = Json.parse(urls)
printThem(json)
4 голосов
/ 26 октября 2010

Возможно, вам повезет больше с использованием анализатора lift-json, доступного по адресу: http://github.com/lift/lift/tree/master/framework/lift-base/lift-json/

Он имеет гораздо более богатый тип DSL, и (несмотря на название) может использоваться полностью автономно за пределами платформы Lift.

0 голосов
/ 26 октября 2010

Если вы уверены, что во всех случаях будет только один тип, вы можете создать следующую модель:

for (l <- json.asInstanceOf[List[List[String]]]) {...}

В противном случае выполните сопоставление с образцом для всех ожидаемых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...