Kotlin Json Вопрос Ожидается строка, но в пути указан BEGIN_OBJECT - PullRequest
0 голосов
/ 23 апреля 2019

Попробуем несколько разных методов для анализа вложенного Json, который менее удобен для пользователя.С помощью регистратора я вижу, что результат поступает правильно, но в журнале отображается ошибка

  com.squareup.moshi.JsonDataException: Expected a string but was BEGIN_OBJECT at path $.capabilities[1]

Я не могу понять, как анализировать массив атрибутов.Я попытался сделать <List<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"
    ]
}

DeviceDetails

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)
        }
    }
}

MainActivity

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()
        }

    }

}

1 Ответ

1 голос
/ 23 апреля 2019

Очевидная проблема заключается в том, что "capabilities": ... в блоке JSON является списком смешанного типа, но вы объявляете его как val capabilities: List<String>.Следовательно, он терпит неудачу, когда попадает в предмет

  {
    "attributes": [
      {
        "name": "switch",
        "dataType": null
      }
    ]
  },

.Трудно догадаться, как этот элемент относится к capabilities, но в настоящее время он выглядит так, как будто это потребует довольно сложного пользовательского адаптера Moshi , чтобы иметь возможность проанализировать его в содержательную структуру данных.

...