Scala JSON разобрать и получить вложенный ключ и значение - PullRequest
0 голосов
/ 03 октября 2018

У меня есть json, как показано ниже,

У меня есть json, как показано ниже, мне нужно извлечь из них значение

{
    "filed1": "value1",
    "message": {
        "payload": [{
            "type": ["Extra","ID"],
             info": {
                "value": 8
            }
        }, {
            "type": ["Free"],
            info": {
                "value": 99
            }
        }, {
            "type": ["Actual"],
             info": {
                "value": 100
            }
        }]
    },
    "code": "0000"
}


{
    "filed1": "value1",
    "message": {
        "payload": [{
            "type": ["Extra", "new"],
            "value": 9
        }]
    },
    "code": "0001"
}

из двух вышеуказанных типов json.

Если у входного json есть список клавиш type , найдите поле типа, содержащее элемент Extra , и получите значение внутри info

Если у входного json есть один type key, затем проверьте поле типа, если у него есть элемент Extra и получите прямую переменную * ue

Я пытаюсь, как показано ниже для типа, но это не удается для спискатипы json, т.е. первый вход json

import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._

val json = parse(myjsonString, true)
val field = compact(render(json \\ "type"))

val ok = field.contains("[\"Extra\"")

if(ok == true){
println("value " +  compact(render(json \\ "value")))
}

1 Ответ

0 голосов
/ 03 октября 2018

Вам нужно использовать json4s, чтобы сделать работу за вас.В частности, вам нужно использовать метод extract на json, чтобы преобразовать его в вашу конкретную структуру данных.Как только вы это сделаете, вы можете обрабатывать его как типы Scala.

Это моя попытка сопоставить структуру вашего JSON с классами случаев Scala:

case class PayloadInfo(value: Int)
case class Payload(`type`: List[String], info: PayloadInfo)
case class Message(payload: List[Payload])
case class Full(filed1: String, message: Message, code: String)

implicit val formats = DefaultFormats

val json = parse(myjsonString, true)

val full = json.extract[Full]

val res = full.message.payload.filter(_.`type`.contains("Extra"))

[Обратные знаки вокруг type обязательны, потому что это зарезервированное слово]

Возможно, я неправильно понял типы, но это должно дать вам представление о том, как это сделать.

Вы также можете обработатьJValue с, но это будет намного более грязным.

...