Кодлин Gson разбор Json — объекта и массива

#arrays #json #list #kotlin #gson

Вопрос:

Я довольно новичок в Kotlin и Json, и в своей работе я использую GSON для анализа Json. Мне нужно проанализировать следующий файл Json в класс с помощью GSON.

  {
      "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.

Спасибо вам уже и приятного вам уик-энда!

Если вам нужна дополнительная информация, просто дайте мне знать

Ответ №1:

Сначала вам нужно определить два типа, которые соответствуют вашей 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})
}