[英]Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path$
[英]Android Studio ArrayList Error: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
我正在 Kotlin 中開發庫存應用程序以供工作,當我試圖在我的一項活動中填充列表視圖時,我感到很困惑。 出於某種原因,它拋出以下錯誤:
W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
使用 OkHttpClient,我可以看到我的 Json 結果:
{
"result":
[
{
"stockOutID":"22",
"skuUsageForStockOutID":"37",
"masterStockListID":"4",
"partNumber":"51220",
"altPartNumber":"Z-234",
"quantity":"2.0",
"price":"6.00","total":"12.00",
"skuType":"INVENTORY-ITEM"
}
],
"targetUrl":null,
"success":true,
"error":null,
"unAuthorizedRequest":false,
"__abp":true
}
由此,我使用了 JsonScheme2Pojo 並得到了以下結果,我將其放入名為“StockOutItemsResponse.java”的文件中:
public class Result {
@SerializedName("stockOutID")
@Expose
private String stockOutID;
@SerializedName("skuUsageForStockOutID")
@Expose
private String skuUsageForStockOutID;
@SerializedName("masterStockListID")
@Expose
private String masterStockListID;
@SerializedName("partNumber")
@Expose
private String partNumber;
@SerializedName("altPartNumber")
@Expose
private String altPartNumber;
@SerializedName("quantity")
@Expose
private String quantity;
@SerializedName("price")
@Expose
private String price;
@SerializedName("total")
@Expose
private String total;
@SerializedName("skuType")
@Expose
private String skuType;
public String getStockOutID() {
return stockOutID;
}
public void setStockOutID(String stockOutID) {
this.stockOutID = stockOutID;
}
public String getSkuUsageForStockOutID() {
return skuUsageForStockOutID;
}
public void setSkuUsageForStockOutID(String skuUsageForStockOutID) {
this.skuUsageForStockOutID = skuUsageForStockOutID;
}
public String getMasterStockListID() {
return masterStockListID;
}
public void setMasterStockListID(String masterStockListID) {
this.masterStockListID = masterStockListID;
}
public String getPartNumber() {
return partNumber;
}
public void setPartNumber(String partNumber) {
this.partNumber = partNumber;
}
public String getAltPartNumber() {
return altPartNumber;
}
public void setAltPartNumber(String altPartNumber) {
this.altPartNumber = altPartNumber;
}
public String getQuantity() {
return quantity;
}
public void setQuantity(String quantity) {
this.quantity = quantity;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
public String getSkuType() {
return skuType;
}
public void setSkuType(String skuType) {
this.skuType = skuType;
}
}
因為響應有一個“結果”作為根,我將以下內容添加到一個名為“StockOutItemResult.java”的文件中,該文件也來自 JsonSchema2Pojo:
@SerializedName("result")
@Expose
private List<StockOutItemsResponse> result = null;
@SerializedName("targetUrl")
@Expose
private Object targetUrl;
@SerializedName("success")
@Expose
private Boolean success;
@SerializedName("error")
@Expose
private Object error;
@SerializedName("unAuthorizedRequest")
@Expose
private Boolean unAuthorizedRequest;
@SerializedName("__abp")
@Expose
private Boolean abp;
public List<StockOutItemsResponse> getResult() {
return result;
}
public void setResult(List<StockOutItemsResponse> result) {
this.result = result;
}
public Object getTargetUrl() {
return targetUrl;
}
public void setTargetUrl(Object targetUrl) {
this.targetUrl = targetUrl;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public Object getError() {
return error;
}
public void setError(Object error) {
this.error = error;
}
public Boolean getUnAuthorizedRequest() {
return unAuthorizedRequest;
}
public void setUnAuthorizedRequest(Boolean unAuthorizedRequest) {
this.unAuthorizedRequest = unAuthorizedRequest;
}
public Boolean getAbp() {
return abp;
}
public void setAbp(Boolean abp) {
this.abp = abp;
}
我的請求名為“StockOutItemsRequest”,如下所示:
public class StockOutItemsRequest {
public String companyID;
public String warehouseID;
public StockOutItemsRequest(String companyID, String warehouseID) {
this.companyID = companyID;
this.warehouseID = warehouseID;
}
}
然后是我的列表視圖適配器,名為“StockOutItemsAdapter.java”:
public class StockOutItemsAdapter extends ArrayAdapter<StockOutItemsResult> {
public StockOutItemsAdapter(Context context, int resource, ArrayList<StockOutItemsResult> objects) {
super(context, resource, objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
StockOutItemsResult stockOutItemsResult = getItem(position);
if(convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.stockout_adapter_view_layout, parent, false);
}
// Lookup view for data population
TextView tv_sku_id = (TextView) convertView.findViewById(R.id.txt_sku_id);
TextView tv_sku = (TextView) convertView.findViewById(R.id.txt_sku);
TextView tv_alt_sku = (TextView) convertView.findViewById(R.id.txt_alt_sku);
TextView tv_quantity = (TextView) convertView.findViewById(R.id.txt_quantity);
TextView tv_price = (TextView) convertView.findViewById(R.id.txt_price);
TextView tv_total = (TextView) convertView.findViewById(R.id.txt_total);
tv_sku_id.setText(stockOutItemsResult.skuUsageForStockOutID);
tv_sku.setText(stockOutItemsResult.partNumber);
tv_alt_sku.setText(stockOutItemsResult.altPartNumber);
tv_quantity.setText(stockOutItemsResult.quantity);
tv_price.setText(stockOutItemsResult.price);
tv_total.setText(stockOutItemsResult.total);
return convertView;
}
}
我的界面:
@GET("getStockOutItems")
Call<ArrayList<StockOutItemsResult>> getStockOutItems(
@Query("companyID") String companyID,
@Query("warehouseID") String warehouseID);
我也傳遞了一些標題。
然后,我在 StockOutActivity.kt 中放置了以下內容:
// global arrayList
private var skuItems: ArrayList<StockOutItemsResult>? = null
使用 Retrofit2,我調用 API:
call.enqueue(object : Callback<ArrayList<StockOutItemsResult>> {
@RequiresApi(Build.VERSION_CODES.KITKAT)
@SuppressLint("SetTextI18n")
override fun onResponse(
call: Call<ArrayList<StockOutItemsResult>>,
response: Response<ArrayList<StockOutItemsResult>>
) {
if (response.isSuccessful) {
val responseString: ArrayList<StockOutItemsResult>? = response.body()
// store values to access later
skuItems = responseString
if (responseString != null) {
val skuList = ArrayList(responseString)
var adapter = StockOutItemsAdapter(
this@StockOutActivity,
R.layout.stockout_adapter_view_layout,
skuList
)
mListViewLayout.adapter = adapter
swipeMenu()
}
} else {
}
}
override fun onFailure(
call: Call<ArrayList<StockOutItemsResult>>,
t: Throwable
) {
t.printStackTrace()
Toast.makeText(this@StockOutActivity, "error :(", Toast.LENGTH_SHORT).show()
}
})
當我在模擬器中運行應用程序時,我的所有其他調用都可以正常工作,但是當我到達這部分時,這就是引發錯誤的原因。
我的結果集顯示一條記錄,但在大多數情況下它會顯示多條記錄,這就是我需要將其轉換為列表的原因。
有人可以告訴我這個問題以及我需要做些什么來解決它,因為我還有大約 4 個活動要開發,我將從這個活動中學習。
謝謝
編輯:下面是顯示收到 json 結果后發生的情況的日志:
I/okhttp.OkHttpClient: {"result":[{"stockOutID":"22","skuUsageForStockOutID":"37","masterStockListID":"4","partNumber":"51220","altPartNumber":" Z-234","quantity":"2.0","price":"6.00","total":"12.00","skuType":"INVENTORY-ITEM"},{"stockOutID":"22"," skuUsageForStockOutID":"38","masterStockListID":"81","partNumber":"3950TKS","altPartNumber":"","quantity":"1.0","price":"275.00","total": "275.00","skuType":"NON-INVENTORY-ITEM"}],"targetUrl":null,"success":true,"error":null,"unAuthorizedRequest":false,"__abp":true} <- - END HTTP (489-byte body) W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ W/System.err: at com.google.gson.stream.JsonReader. beginArray(JsonReader.java:350) 在 Z4D236D9A2D102C5FE 6AD1C50DA4BEC50Z.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80) W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61 ) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243) at retrofit2 .OkHttpCall$1.onResponse(OkHttpCall.java:153) 在 okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) W/System.err: 在 Z93F725A07423FE1C889 F448B33D21F46Z.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923)
我這樣稱呼我的服務:
@GET("api/mobistock/getStockOutItems")
Call<StockOutItemsResult> getStockOutItems(
@Query("companyID") String companyID,
@Query("warehouseID") String warehouseID,
@Header("Authorization") String token,
@Header("Content-Type") String cType,
@Header("Abp.TenantId") String tenantId);
在我的活動中......
call.enqueue(object : Callback<StockOutItemsResult> {
override fun onResponse(
call: Call<StockOutItemsResult>, response: Response<StockOutItemsResult>
) {
if(response.isSuccessful) {
**//stockOutItems_Array = response.body() asArrayList<StockOutItemsResult> ** //<--- was trying to see what was being returned, but it errors out.
}
else {
//Log.e("Response Error", "Something went wrong")
}
}
override fun onFailure(call: Call<StockOutItemsResult>, t: Throwable) {
Log.e("Response Failure Error", "Something went wrong")
}
})
您來自服務器的 JSON 響應無效。 使用來自服務器的響應嘗試此在線 JSON 驗證器,並驗證它是否有效。
編輯
根據您的要求:
@GET("getStockOutItems")
Call<ArrayList<StockOutItemsResult>> getStockOutItems(
@Query("companyID") String companyID,
@Query("warehouseID") String warehouseID);
您希望返回一個數組,但服務器發送一個 object。 因此,如果StockOutItemsResult
是代表您的響應的 object ,您應該在此處編寫您的方法:
@GET("getStockOutItems")
Call<StockOutItemsResult> getStockOutItems(
@Query("companyID") String companyID,
@Query("warehouseID") String warehouseID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.