KotlinGson解析Json对象和数组

42fyovps  于 2022-11-06  发布在  Kotlin
关注(0)|答案(1)|浏览(231)

我对Kotlin和Json很陌生,在我的工作中,我使用GSON来解析Json。我需要使用GSON将下面的Json文件解析成一个类。

{
      "apiKey": "blablabla",
      "baseUrl": "blablabla",
      "requestData": [
        {
          "lng": "6.971",
          "lat": "50.942",
          "rad": "1.5",
          "type": [
                  "diesel",
                  "super"
          ]
        },
        {
          "lng": "6.442",
          "lat": "51.180",
          "rad": "1.5",
          "type": [
            "diesel",
            "super"
          ]
        },{
          "lng": "7.136",
          "lat": "50.991",
          "rad": "1.5",
          "type": [
            "diesel",
            "super"
          ]
        }
      ]
    }

现在我试着做一个这样的数据类:

data class ApiParameterData(
    var apiKey: String? = null,
    var baseUrl: String? = null,
    var requestData: String? = null) {

}

我还创建了另一个类来存储Json信息,如下所示:

class Tankstelle: JsonDeserializer<ApiParameterData> {
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?
    ): ApiParameterData {
        json as JsonObject

        val apiKey = json.get("apiKey").asString
        val baseUrl = json.get("baseUrl").asString
        val requestDataJson = json.get("requestData")
        val requestData = if (requestDataJson.isJsonObject) requestDataJson.asJsonObject.toString() else requestDataJson.toString()

        return ApiParameterData(apiKey, baseUrl, requestData)
    }
}

我试着这样称呼它:

val gsonConfig = GsonBuilder().registerTypeAdapter(ApiParameterData::class.java, Tankstelle()).create()
val tanke = gsonConfig.fromJson(readJson, ApiParameterData::class.java)
println(tanke.requestData?.get(0))

但是我得到的输出当然是“[”。我想是因为我得到了一个字符串什么的,而这是它的第一个符号吗?
我需要遍历requestData列表并将其存储为一个类的示例,并且需要访问每个不同的值。问题是,我想给予Json文件不同的位置和范围,它应该寻找加油站。通过阅读Json,它应该获取所有的片段,并为我在requestData列表中写入的每个位置创建一个链接。因此,在这种情况下,我需要在最后3个不同的链接。但这是我自己可以做的另一部分,我只是不知道如何解析它,以便访问和存储此Json中的每个值。
谢谢你们,祝你们周末愉快!
如果你需要更多的信息,请告诉我

wooyq4lh

wooyq4lh1#

首先,您需要定义两个Map到JSON结构的类型

class ApiParameterData(
        val apiKey: String,
        val baseUrl: String,
        val requestData: List<RequestObject>
)

class RequestObject(
        val lng: String,
        val lat: String,
        val rad: String,
        val type: List<String>
)

现在只需将其解析为

val apiData = Gson().fromJson(readJson, ApiParameterData::class.java)     // No need to add TypeAdapter

// To get requestData
val requestData = apiData.requestData
requestData.forEach { 
  print("${it.lng}, ${it.lat}, ${it.rad}, ${it.type})
}

相关问题