不确定如何解决问题 "com.squareup.moshi.JsonDataException: Expected BEGIN_ARRAY but was STRING at path $"

Not sure how to resolve the issue "com.squareup.moshi.JsonDataException: Expected BEGIN_ARRAY but was STRING at path $"

我正在开发一个用 Kotlin 编写的 Android 应用程序。我正在使用 Moshi 和 Retrofit 从服务器推送和拉取一些数据。在这个错误中,我将数据推送到服务器,并期待 json 字符串响应,无论成功与否,每一行都有一个“记录”。我正在以这种方式同步多个表,但由于某种原因,其中一个表无法正常工作。下面是将设备(工作)与 PalletsPicked(抛出此错误)进行比较。

// The Sync Up Call for Devices
val repResult = SyncUpApi.retrofitService.syncUp(
    "devices", _deviceid, _deviceKey, devicesJson
)

// The Sync Up Call for Pallets Picked
val repResult = SyncUpApi.retrofitService.syncUp(
    "pallets_picked", _deviceid, _deviceKey, palletsPickedJson
)

这里是同步 Api


import com.squabtracker.spoc.entity.SyncUpResponseEntity
import retrofit2.http.*

interface SyncUpApiService {

    @FormUrlEncoded
    @POST("sync_up.php")
    suspend fun syncUp(@Field("table") Table: String,
                         @Field("deviceid") DeviceID: Int,
                         @Field("key") DeviceKey: String,
                         @Field("data") Data: String): List<SyncUpResponseEntity>
}

object SyncUpApi {
    val retrofitService : SyncUpApiService by lazy {
        Network.retrofit.create(SyncUpApiService::class.java) }
}

这是 SyncUpResponseEntity 的结构

data class SyncUpResponseEntity (

    @ColumnInfo @Json(name= "primary_key")      val PrimaryKey: Long,
    @ColumnInfo @Json(name= "fk_repid")         val fkRepID: Int,
    @ColumnInfo @Json(name= "table_name")       val TableName: String,
    @ColumnInfo @Json(name= "success")          val Success: Int

)

在服务器端接受干净的数据,在遍历每个项目之前创建一个响应$response = array();

然后在 Devices 中的每个循环中:

$response[] = array(
            "primary_key" => $item['pk_deviceid'],
            "fk_repid" => $item['fk_repid'],
            "table_name" => "devices",
            "success" => $success);

并且在 PalletsPicked

$response[] = array(
            "primary_key" => $item['pk_pallets_pickedid'],
            "fk_repid" => $item['fk_repid'],
            "table_name" => "pallets_picked",
            "success" => $success);

最后在发送回设备之前 - 设备和托盘都已拾取

echo json_encode($response);

服务器对设备的响应

[{"primary_key":5,"fk_repid":870,"table_name":"devices","success":1}]

以及 Pallets Picked 的响应

[{"primary_key":1009700278,"fk_repid":749,"table_name":"pallets_picked","success":1}]

在 Kotlin 中,我调用了包含在 try-catch 中的 SyncUpApi,对于 PalletsPicked,它出错了,我不确定为什么它适用于某些设备,但不适用于这个设备.最初的错误是: com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $ 然后将其设置为 lenient 我得到: com.squareup.moshi.JsonDataException: Expected BEGIN_ARRAY but was STRING at path $

如果需要显示任何其他代码来帮助解决问题,请告诉我...

非常感谢任何帮助! 谢谢!

我找到了这篇关于如何添加日志记录的文章 How can I debug my retrofit API call?

根据接受的答案添加此内容后,我能够详细了解我的通话和回复。原来 PHP 在返回我想要的实际 json 数据之前吐出一个未定义的索引警报。我解决了这个问题,现在一切正常了!