我有一个 API,它返回不同的键,没有一个特定的键来响应检测响应的类型。在某些情况下,“key”类型不同(“fanstatus”属于 Int,List<*>),并且某些键仅在某些情况下存在。我不确定 GSON 中是否有直接的方法将每个响应映射到对应的类如 SystemResourcesGetRespWithPsuAsInt。
我尝试添加如下所示的自定义反序列化器并将其添加为适配器,但它引发了以下异常。我正在考虑的方法是检查响应中的字段并将它们直接转换为实体类,而不是使用单独的类。但我不确定这是否是最优的。欢迎任何建议。
java.lang.RuntimeException: Unable to invoke no-args constructor for class models.npb.system.SystemResourcesResp. Registering an InstanceCreator with Gson for this type may fix this problem.
class CustomDeserializer : JsonDeserializer<SystemResourcesResp> {
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): SystemResourcesResp? {
val ja = json
val gson = Gson()
val resp = gson.fromJson(ja, SystemResourcesResp::class.java)
return resp
}
}
data class SystemResourcesGetResp(override val response: Response): SystemResourcesResp(response) {
data class Response(
override val respCode: Int,
override val webObjects: List<WebObject>
): SystemResourcesResp.Response(respCode, webObjects)
data class WebObject(
val fanstatus: List<Map<String,String>> = listOf(),
val powerstatus: List<Map<String,String>> = listOf()
): SystemResourceWebObject()
}
abstract class SystemResourceWebObject(
var maxcpu: Int = 0,
var currentcpu: Int = 0,
var maxram: Int = 0,
var currentram: Int = 0,
var maxflash: Int = 0,
var currentflash: Int = 0,
var maxtemperature: Int = Integer.MIN_VALUE,
var mintemperature: Int = Integer.MIN_VALUE,
var currenttemperature: Int = Integer.MIN_VALUE,
var totalRamInMB: Int? = null,
var currentRamInMB: Int? = null,
var totalFlashInBytes: String? = null,
var currentFlashInBytes: String? = null
)
data class SystemResourcesGetRespMarvel9_4_9OrBelow(override val response: Response): SystemResourcesResp(response) {
data class Response(
override val respCode: Int,
override val webObjects: List<WebObject>
): SystemResourcesResp.Response(respCode, webObjects)
data class WebObject(
val fanstatus: Int = 0,
var powerunit1: Int = 0,
var powerunit2: Int = 0
): SystemResourceWebObject()
}
data class SystemResourcesGetRespWithPsuAsInt(override val response: Response): SystemResourcesResp(response) {
data class Response(
override val respCode: Int,
override val webObjects: List<WebObject>
): SystemResourcesResp.Response(respCode, webObjects)
data class WebObject(
val fanstatus: List<Map<String,String>> = listOf(),
var powerunit1: Int = 0,
var powerunit2: Int = 0
): SystemResourceWebObject()
}
data class SystemResourcesGetRespForMarvel9_4_10(override val response: Response) : SystemResourcesResp(response) {
class Response(
override val respCode: Int,
override val webObjects: List<WebObject>
): SystemResourcesResp.Response(respCode, webObjects)
data class WebObject(
val fanstatus: List<Map<String, String>> = listOf(),
val powerstatus: List<Map<String, String>> = listOf(),
val currentTemperatureInCelsius: Int,
val maxTemperatureThresholdInCelsius: Int,
val minTemperatureThresholdInCelsius: Int
) : SystemResourceWebObject()
}
sealed class SystemResourcesResp(open val response: Response) {
abstract class Response(
open val respCode: Int,
open val webObjects: List<SystemResourceWebObject>
)
}