不确定如何解决问题 "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 数据之前吐出一个未定义的索引警报。我解决了这个问题,现在一切正常了!
我正在开发一个用 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 数据之前吐出一个未定义的索引警报。我解决了这个问题,现在一切正常了!