android - Kotlin Json 问题期望一个字符串,但在路径上是 BEGIN_OBJECT
问题描述
尝试一些不同的方法来解析不太友好的嵌套 Json。使用记录器,我可以看到正确输入的结果,但日志显示错误
com.squareup.moshi.JsonDataException: Expected a string but was BEGIN_OBJECT at path $.capabilities[1]
我一生都无法弄清楚如何解析 Attribute 数组。我试过做<List<Attribute>>
和属性,它不会改变结果。有没有办法将 Attribute 数组转换为列表?在 Android 编码方面非常新,因此寻求一些帮助。
要解析的 JSON
{
"id": "65",
"name": "Switch - Kitchen",
"label": "Switch - Kitchen",
"attributes": [
{
"name": "switch",
"currentValue": "off",
"dataType": "ENUM",
"values": [
"on",
"off"
]
}
],
"capabilities": [
"Switch",
{
"attributes": [
{
"name": "switch",
"dataType": null
}
]
},
"Configuration",
"Refresh",
"Actuator"
],
"commands": [
"configure",
"flash",
"off",
"on",
"refresh",
"refresh"
]
}
设备详情
data class DeviceDetails(
@Json(name="CapabilitiesList")
var attributeList: Attribute,
@Json(name="CapabilitiesList")
val capabilities: List<String>,
@Json(name="CommandsList")
val commands: List<String>,
var id: String = "",
var label: String = "",
var name: String = ""
)
data class Attribute(
val currentValue: String,
val dataType: String,
val name: String,
@Json(name="AttributesValues")
val values: List<String>
)
DeviceDetailsAPI
interface DeviceDetailsAPI {
@GET("devices/65")
fun getDeviceDetails(@Query("access_token") access_token: String):
Deferred<DeviceDetails>
companion object{
operator fun invoke(): DeviceDetailsAPI {
//Debugging URL//
val interceptor : HttpLoggingInterceptor = HttpLoggingInterceptor().apply {
this.level = HttpLoggingInterceptor.Level.BODY }
val client : OkHttpClient = OkHttpClient.Builder().apply {
this.addInterceptor(interceptor)}.build()
//Debugging URL//
val okHttpClient = OkHttpClient.Builder()
.build()
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://xxx.xxx.xxx.xxx/apps/api/109/")
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(MoshiConverterFactory.create())
.client(client)
.build()
.create(DeviceDetailsAPI::class.java)
}
}
}
主要活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val API_KEY = "xxxxxxxx"
val testapiService = DeviceListAPI()
val testapiDetails = DeviceDetailsAPI()
//GlobalScope.launch (Dispatchers.Main) {
//val DeviceListAPI = testapiService.getAllDevices(access_token = API_KEY).await()
//textViewID.text = DeviceListAPI.toString()
//}
GlobalScope.launch (Dispatchers.Main) {
val DeviceDetailsAPI = testapiDetails.getDeviceDetails(access_token = API_KEY).await()
textViewID.text = DeviceDetailsAPI.toString()
}
}
}
解决方案
明显的问题是"capabilities": ...
JSON 块中的 是混合类型列表,但您将其声明为val capabilities: List<String>
. 因此,当它击中时它会失败
{
"attributes": [
{
"name": "switch",
"dataType": null
}
]
},
物品。很难猜测该capabilities
项目与.
推荐阅读
- machine-learning - 是否可以通过神经网络输出概率?
- c++ - 3Sum 实现上的堆缓冲区溢出
- javascript - 如果键匹配,则恢复对象的值
- mysql - 寻找按小时分组的查询并收集用户信息
- java - 在 arcore 3D 模型中应用动态纹理
- javascript - 当 loadonce 设置为 true 时分页不起作用
- python - 使用 Django 支付网关 (Paytm) 时如何修复“'DeferredAttribute' 类型的 /orders/create/ 参数的 TypeError 不可迭代”
- fortran - 使用 Fortran 中的 if 条件从多列中提取值
- python - 具有多个常用选项的命令使用自定义装饰器进入一个参数
- algorithm - 什么是没有。有n个标记节点的不同二叉树可能是什么?