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