簡體   English   中英

Android Studio ArrayList 錯誤:預期為 BEGIN_ARRAY,但在第 1 行第 2 列路徑為 BEGIN_OBJECT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM