使用Klaxon使用动态键解析地图

时间:2019-06-18 14:35:11

标签: kotlin gson klaxon

我有以下JSON代码段:

 {  
   "hd":{  
      "hdEnabled":true,
      "defaultStreamQualitySetting":"HD720",
      "streamQualitySettings":{  
         "SD":"SD - low quality",
         "HD720":"Standard HD - 720p",
         "HD1080":"Full HD - 1080p"
      }
   }
}

我想将带有Klaxon和Gson的streamQualitySettings解析为一个名为“ Option”的对象,该对象具有键和说明,因此我以3个选项的列表结尾

  • 选项(键= SD,描述=“ SD-低质量”)
  • 选项(键= HD720,描述=“标准高清-720p”)
  • 选项(键= HD1080,描述=“全高清-1080p”)

我如何通过Klaxon(或Gson)实现这一目标?

这是我的代码

val jsonArray = bootstrapJsonObject()
          .lookup<JsonArray<JsonObject>>("hd.streamQualitySettings")
          .first()

val gson = Gson()
val options = ArrayList<Option>()
jsonArray.forEach {
    options.add(gson.fromJson(it.toJsonString(), Option::class.java))
}

1 个答案:

答案 0 :(得分:1)

为什么同时使用gson和klaxon?如果您想使用gson,那么kotson是流畅的kotlin dsl的替代选择。

这是klaxon的解决方案:

fun convert(input: String): List<Option> {
    val streamObj = (Parser.default().parse(StringBuilder(input)) as JsonObject)
        .obj("hd")!!
        .obj("streamQualitySettings")!!
    return streamObj.keys.map { Option(it, streamObj.string(it)!!) }
}

Parse, then move down to the `streamQualitySettings`.

Get all the keys and map them to `Option`.