scala json解析并获取嵌套的键和值

时间:2018-10-03 10:58:23

标签: scala jackson json4s

我有一个像下面的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 的type字段,并获取info

内部的值

如果输入的json具有一个 type 键,则检查type字段,如果它具有元素 Extra 并获得直接va; 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 :(得分:0)

您需要使用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,但这会更加麻烦。