2015-07-07 3 views
0

У меня есть JSON строку какДоступ к внутренней области JSON в Scala

{ 
    "whatsNew" : { 
    "oldNotificationClass" : "WhatsNewNotification", 
    "notificationEvent" : { ..... }, 
    "result" : { 
     "notificationCount" : 10 
     ..... 
    } 
    }, 
    ...... 
    "someEmpty": { }, 
    ...... 
} 

Я пытаюсь получить notificationCount поле с помощью json4s в Scala следующим образом, но notificationCount приходит в пустой для всех. Любая помощь?

UPDATE Также, если какая-то пара пуста, как я могу обрабатывать пустое состояние и продолжать цикл?

Функция, возвращающая JSON строку из файла

def getData(): Map[String, AnyRef] = { 
    val jsonString = scala.io.Source.fromInputStream(this.getClass.getResourceAsStream("/sample.json")).getLines.mkString 
    val jsonObject = parse(s""" $jsonString """) 
    jsonObject.values.asInstanceOf[Map[String, AnyRef]] 
} 

код, чтобы получить поля

val myMap: Map[String, AnyRef] = MyDataLoader.getData 

for((key, value) <- myMap) { 
    val id = key 
    val eventJsonStr: String = write(value.asInstanceOf[Map[String, String]] get "notificationEvent") 
    val resultJsonStr: String = write(value.asInstanceOf[Map[String, String]] get "result") 
    //val notificationCount: String = write(value.asInstanceOf[Map[String, Map[String, String]]] get "notificationCount") 
} 

ответ

0

Вы можете использовать путь и извлечь так:

val count: Int = (parse(jsonString) \ "whatsNew" \ "result" \ "notificationCount").extract[Int] 

вам нужен этот импорт для .extract[Int] к работе:

implicit val formats = DefaultFormats 

Чтобы сделать это в цикле:

parse(jsonString).children.map { child => 
    val count: Int = (child \ "result" \ "notificationCount").extract[Int] 
    ... 
} 
+0

Я хочу сделать внутри карты для цикла. не в getData(). –

+0

Лучше сохранить JSON AST - или дерево - при прохождении через дерево, чтобы вы могли делать пути с помощью поддеревьев. См. Обновление. – bjfletcher