0

我有一个 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>
        )
    }
4

0 回答 0