首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GSON & Volley =>期望BEGIN_ARRAY,但在第1列2路径$上是BEGIN_OBJECT

GSON & Volley =>期望BEGIN_ARRAY,但在第1列2路径$上是BEGIN_OBJECT
EN

Stack Overflow用户
提问于 2017-04-01 11:33:07
回答 3查看 1.5K关注 0票数 1

这个错误把我逼疯了,我试着使用不同类型的截击请求,比如JsonArrayRequestJsonObjectRequest,但是没有运气!!

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:预期的BEGIN_ARRAY,但在第1列第2行路径$上是BEGIN_OBJECT

以下是JSON响应链接=> http://www.mocky.io/v2/58df83a80f00005922eaf4e1

,这是我的模型类

代码语言:javascript
复制
 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;
 }
}

我的适配器

代码语言:javascript
复制
  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());

    }


}

}

请求方法在片段

代码语言:javascript
复制
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());
    }
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-01 12:00:45

这里您的问题是orders对象。您不需要反序列化orders。你可以解决这个问题

代码语言:javascript
复制
public class OrderHolder{
    private List<Order> orders;

    public List<Order> getOrders(){ return orders; }

} 

OrderHolder holder = new Gson().fromJson(response, OrderHolder.class);
modelData = holder.getOrders();

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2017-04-01 13:02:38

预期的BEGIN_ARRAY但在第1列第2列为BEGIN_OBJECT路径$

这很容易理解:它意味着解析类似于list的内容(因此需要BEGIN_ARRAY [ ),但是给定的JSON文档以BEGIN_OBJECT {开头,这是由不匹配的预期类型引起的。这种情况发生在JSON文档的最开始。

除了mismanc的JSON之外,还有第三种方法,它需要稍微多一点的代码(尽管可以提取到一个方法),但它不需要包装器或中间JSON树(比如JsonElement及其子类)(对于第一种情况,这可能会消耗更多的内存,而对于第二种情况,肯定会消耗更多的内存,因为整个中间JSON树必须存储在内存中)。

代码语言:javascript
复制
// 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自动转换器/生成器并不总是创建最佳映射。例如:

  • ItemsNumOrdersNum都由相同的POJO结构表示,但是它可以是final class Id { @SerializedName("id") final Integer id = null; }
  • Customer avatar_url表示为java.lang.String,但也可以是java.net.URL

小音符:

  • 每次需要反序列化时,都不需要创建Gson类实例。它们是完全线程安全的,可以实例化一次,然后很容易重用.另外,创建和配置的其他Gson实例也可以直接注入到代码中。
  • 因此,使用Type生成的TypeToken实例可以被认为是不可变的值对象,因此也要缓存到static final字段中。
票数 1
EN

Stack Overflow用户

发布于 2017-04-01 13:10:33

这是正确的答案,我使用了错误的请求类型..!

代码语言:javascript
复制
  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);

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43156287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档