这个错误把我逼疯了,我试着使用不同类型的截击请求,比如JsonArrayRequest和JsonObjectRequest,但是没有运气!!
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:预期的BEGIN_ARRAY,但在第1列第2行路径$上是BEGIN_OBJECT
以下是JSON响应链接=> http://www.mocky.io/v2/58df83a80f00005922eaf4e1
,这是我的模型类
public class Order {
@SerializedName("status")
@Expose
private String status; //status
@SerializedName("total")
@Expose
private float price; //total
@SerializedName("created_at")
@Expose
private Date time;
@SerializedName("line_items")
@Expose
public List<ItemsNum> lineItems = new ArrayList<ItemsNum>();
@SerializedName("sub_orders")
@Expose
public List<OrdersNum> subOrders = new ArrayList<OrdersNum>();
@SerializedName("shipping_address")
@Expose
public CusAddress cusAdress;
@SerializedName("customer")
@Expose
public Customer customer;
public Order(Customer customer, String status, float price, String cusPicURL, String firstName, String lastName, Date time, List<ItemsNum> lineItems, List<OrdersNum> subOrders, CusAddress cusAdress) {
this.status = status;
this.price = price;
this.customer = customer;
this.time = time;
this.lineItems = lineItems;
this.subOrders = subOrders;
this.cusAdress = cusAdress;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public List<ItemsNum> getLineItems() {
return lineItems;
}
public void setLineItems(List<ItemsNum> lineItems) {
this.lineItems = lineItems;
}
public List<OrdersNum> getSubOrders() {
return subOrders;
}
public void setSubOrders(List<OrdersNum> subOrders) {
this.subOrders = subOrders;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public CusAddress getCusAdress() {
return cusAdress;
}
public void setCusAdress(CusAddress cusAdress) {
this.cusAdress = cusAdress;
}
// //////////// Inner-Classes
public class Customer {
@SerializedName("avatar_url")
@Expose
private String cusPicURL; //avatar_url
@SerializedName("first_name")
@Expose
private String firstName; //first_name
@SerializedName("last_name")
@Expose
private String lastName; //last_name
public String getCusPicURL() {
return cusPicURL;
}
public void setCusPicURL(String cusPicURL) {
this.cusPicURL = cusPicURL;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public class CusAddress {
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@SerializedName("address_1")
@Expose
public String address;
@SerializedName("city")
@Expose
public String city;
@SerializedName("state")
@Expose
public String state;
@SerializedName("country")
@Expose
public String country;
}
public class ItemsNum {
@SerializedName("id")
@Expose
public Integer id;
}
public class OrdersNum {
@SerializedName("id")
@Expose
public Integer id;
}
}我的适配器
public class OrdersDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public Context context;
private int num;
ArrayList<Order> orders;
public OrdersDataAdapter(ArrayList<Order> orders, Context context) {
this.orders = orders;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_card, parent, false);
return new NewOrderVH(v);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
final Order order = this.orders.get(position);
final NewOrderVH vh1 = (NewOrderVH) holder;
vh1.setData(orders.get(position));
}
@Override
public int getItemCount() {
return orders.size();
}
public class NewOrderVH extends RecyclerView.ViewHolder {
private ImageView cusPic;
private TextView cusName;
private TextView CusAdress;
private TextView vendorsNum;
private TextView itemsNum;
private TextView time;
public NewOrderVH(View itemView) {
super(itemView);
orderCard = (CardView) itemView.findViewById(R.id.OrderCard);
cusPic = (ImageView) itemView.findViewById(R.id.cusPic);
cusName = (TextView) itemView.findViewById(R.id.cusName);
CusAdress = (TextView) itemView.findViewById(R.id.CusAdress);
vendorsNum = (TextView) itemView.findViewById(R.id.vendorsNum);
itemsNum = (TextView) itemView.findViewById(R.id.itemsNum);
time = (TextView) itemView.findViewById(R.id.time);
}
public void setData(final Order data) {
cusName.setText(data.customer.getFirstName() + "" + data.customer.getLastName());
Picasso.with(context).load(data.customer.getCusPicURL()).into(cusPic);
time.setText(data.getTime().getMinutes());
vendorsNum.setText(data.getSubOrders().size());
itemsNum.setText(data.getLineItems().size());
CusAdress.setText(data.cusAdress.getAddress() + "" + data.cusAdress.getCity() + "" + data.cusAdress.getCountry() + "" + data.cusAdress.getState());
}
}}
请求方法在片段中
private void fetchPosts() {
requestQueue = Volley.newRequestQueue(getActivity());
StringRequest jRequest = new StringRequest(Request.Method.GET, ENDPOINT, onPostsLoaded, onPostsError);
requestQueue.add(jRequest);
}
private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
Type listType = new TypeToken<List<Order>>() {}.getType();
modelData = gson.fromJson(response, listType);
adapter = new OrdersDataAdapter((ArrayList<Order>) modelData, getActivity());
recyclerView.setAdapter(adapter);
adapter.setMode(Attributes.Mode.Single);
}
};
private final Response.ErrorListener onPostsError = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("PostActivity", error.toString());
}
};发布于 2017-04-01 12:00:45
这里您的问题是orders对象。您不需要反序列化orders。你可以解决这个问题
public class OrderHolder{
private List<Order> orders;
public List<Order> getOrders(){ return orders; }
}
OrderHolder holder = new Gson().fromJson(response, OrderHolder.class);
modelData = holder.getOrders();或
JsonElement jelement = new JsonParser().parse(response);
JsonObject jobject = jelement.getAsJsonObject();
String ordersString = jobject.get("orders").getAsString();
Gson gson = new Gson();
Type listType = new TypeToken<List<Order>>() {}.getType();
modelData = gson.fromJson(ordersString, listType);发布于 2017-04-01 13:02:38
预期的BEGIN_ARRAY但在第1列第2列为BEGIN_OBJECT路径$
这很容易理解:它意味着解析类似于list的内容(因此需要BEGIN_ARRAY [ ),但是给定的JSON文档以BEGIN_OBJECT {开头,这是由不匹配的预期类型引起的。这种情况发生在JSON文档的最开始。
除了mismanc的JSON之外,还有第三种方法,它需要稍微多一点的代码(尽管可以提取到一个方法),但它不需要包装器或中间JSON树(比如JsonElement及其子类)(对于第一种情况,这可能会消耗更多的内存,而对于第二种情况,肯定会消耗更多的内存,因为整个中间JSON树必须存储在内存中)。
// JsonReader allows to read JSON token stream
try ( final JsonReader jsonReader = new JsonReader(new StringReader(JSON)) ) {
// Just skip the leading `{`
jsonReader.beginObject();
// Check if the next property name is what we're expecting
final String name = jsonReader.nextName();
if ( !name.equals("orders") ) {
throw new MalformedJsonException("Unexpected: " + name);
}
// If it's fine, then we:
// * are assuming the JsonReader "pointer" is at the property value now
// * are asking Gson for the proper type adapter
@SuppressWarnings("unchecked")
final TypeAdapter<List<Order>> typeAdapter = (TypeAdapter<List<Order>>) gson.getAdapter(TypeToken.get(orderListType));
// Just read the orders
final List<Order> orders = typeAdapter.read(jsonReader);
System.out.println(orders);
}JSON模式到POJO自动转换器/生成器并不总是创建最佳映射。例如:
ItemsNum和OrdersNum都由相同的POJO结构表示,但是它可以是final class Id { @SerializedName("id") final Integer id = null; }。avatar_url表示为java.lang.String,但也可以是java.net.URL。小音符:
Gson类实例。它们是完全线程安全的,可以实例化一次,然后很容易重用.另外,创建和配置的其他Gson实例也可以直接注入到代码中。Type生成的TypeToken实例可以被认为是不可变的值对象,因此也要缓存到static final字段中。发布于 2017-04-01 13:10:33
这是正确的答案,我使用了错误的请求类型..!
JsonObjectRequest jsObjRequest = new
JsonObjectRequest(Request.Method.GET,ENDPOINT,null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Gson gson = new Gson();
Type listType = new TypeToken<List<Order>>() {}.getType();
try {
List<Order> o = new ArrayList<>();
o = gson.fromJson(response.getJSONArray("orders").toString(), listType);
if(o != null && !o.isEmpty()){
modelData.addAll(o);
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsObjRequest);
}https://stackoverflow.com/questions/43156287
复制相似问题