Kotlin Gson 解析 Json 对象和数组
Kotlin Gson parsing Json Object and Array
我对 Kotlin 和 Json 还很陌生,在我的工作中我使用 GSON 来解析 Json。
我需要使用 GSON 将以下 Json 文件解析为 Class。
{
"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"
]
}
]
}
现在我尝试制作这样的数据class:
data class ApiParameterData(
var apiKey: String? = null,
var baseUrl: String? = null,
var requestData: String? = null) {
}
我还制作了另一个class来存储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))
当然我得到的输出是 "[" 。我想是因为我找回了一个 String 之类的东西,这是它的第一个符号?
我需要遍历 requestData 列表并将其存储为 class 的实例,并且需要访问每个不同的值。
问题是我想给 Json 文件不同的位置和范围,它应该寻找加油站。通过读取 Json 它应该获取所有部分并为我在 requestData 列表中写入的每个位置创建一个 link 。所以在这种情况下,我最后需要 3 个不同的 link。但这是我自己可以做的另一部分。我只是不知道如何解析它所以我可以访问和存储这个 Json.
中的每个值
谢谢你,周末愉快!
如果您需要更多信息,请告诉我
首先你需要定义两个映射到你的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})
}
我对 Kotlin 和 Json 还很陌生,在我的工作中我使用 GSON 来解析 Json。 我需要使用 GSON 将以下 Json 文件解析为 Class。
{
"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"
]
}
]
}
现在我尝试制作这样的数据class:
data class ApiParameterData(
var apiKey: String? = null,
var baseUrl: String? = null,
var requestData: String? = null) {
}
我还制作了另一个class来存储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))
当然我得到的输出是 "[" 。我想是因为我找回了一个 String 之类的东西,这是它的第一个符号?
我需要遍历 requestData 列表并将其存储为 class 的实例,并且需要访问每个不同的值。 问题是我想给 Json 文件不同的位置和范围,它应该寻找加油站。通过读取 Json 它应该获取所有部分并为我在 requestData 列表中写入的每个位置创建一个 link 。所以在这种情况下,我最后需要 3 个不同的 link。但这是我自己可以做的另一部分。我只是不知道如何解析它所以我可以访问和存储这个 Json.
中的每个值谢谢你,周末愉快!
如果您需要更多信息,请告诉我
首先你需要定义两个映射到你的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})
}