【问题标题】:JSON Error: No value for profile_pictureJSON 错误:profile_picture 没有值
【发布时间】:2016-03-24 07:36:53
【问题描述】:

我有一个 Web 服务,它返回图像列表(个人资料图片)及其名称和 ID 号。有些成员没有头像。所以我从drawable添加默认图片。我正在使用 volley post 和 pojo 来获取 json 并在 gridview 中添加图片和名称。但不是显示图像和名称,而是显示 JSON 错误消息“没有 profile_picture 的值”。 This 是我的 json 结果。因此,在获取图像和名称方面的任何帮助将不胜感激。

Main fragment:

public class SearchName extends Fragment{

    private GridView mGridView;
    private GridItem newItem;
    private GridAdapter mGridAdapter;
    private ArrayList<GridItem> mGridData;
    public static final String KEY_USERID = "user_id", KEY_NAME = "search_text";
    private static final String FETCH_ALL_MEMBERS = "http://example.com/api/member/get-all/";
    String profile_picture = "";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.searchname, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mGridView = (GridView)view.findViewById(R.id.grid_view);

        displayLog();

        mGridData = new ArrayList<>();
        mGridAdapter = new GridAdapter(getContext(), R.layout.gridrow, mGridData);
        mGridView.setAdapter(mGridAdapter);



    }

    private void displayLog() {
        StringRequest stringRequest = new StringRequest(Request.Method.POST, FETCH_ALL_MEMBERS,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        try {
                            JSONObject jObj = new JSONObject(response);

                            System.out.println(jObj);

                            String status = jObj.getString("status");

                            // Now check status value
                            if (status.equals("0")) {
                                Toast.makeText(getActivity(), "There was some error! Please try again.", Toast.LENGTH_LONG).show();
                            } else if (status.equals("1")) {


                                JSONArray result = jObj.getJSONArray("result");
                                for (int i = 0; i < result.length(); i++) {
                                    JSONObject json_data = result.getJSONObject(i);
                                    String name = json_data.getString("name");
                                    String user_id = json_data.getString("user_id");
                                    //String profile_picture = json_data.getString("profile_picture");

                                    newItem.setName(name);
                                    newItem.setUserId(user_id);
                                    if(json_data.has("profile_picture")){

                                        //String image_def = String.valueOf(R.drawable.default_profile);
                                        newItem.setImage(json_data.getString("profile_picture"));

                                    }else{

                                        Uri path = Uri.parse("android.resource://com.sam.fitlincsearch/" + R.drawable.default_profile);
                                        String image_def = path.toString();
                                        newItem.setImage(image_def);

                                    }


                                    mGridData.add(newItem);
                                }


                                mGridAdapter.notifyDataSetChanged();

                            } else {
                                // Error in login. Get the error message
                                String errorMsg = jObj.getString("error_msg");
                                Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
                            }
                        } catch (JSONException e) {
                            // JSON error
                            e.printStackTrace();
                            Toast.makeText(getActivity(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getActivity(), error.toString(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put(KEY_USERID, "1");
                return params;
            }

        };

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);
    }
}
Adapter:

public class GridAdapter extends ArrayAdapter<GridItem> {

    private Context mContext;
    int resource;
    private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();

    public GridAdapter(Context mContext, int resource, ArrayList<GridItem> mGridData) {
        super(mContext, resource, mGridData);
        this.resource = resource;
        this.mContext = mContext;
        this.mGridData = mGridData;
    }

    public void setGridData(ArrayList<GridItem> mGridData) {
        this.mGridData = mGridData;
        notifyDataSetChanged();
    }

    @Override
    public GridItem getItem(int position) {
        return super.getItem(position);
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        ViewHolder holder;
        if (v == null) {
            holder = new ViewHolder();
            LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();

                v = inflater.inflate(R.layout.gridrow, parent, false);
                holder.image = (ImageView) v.findViewById(R.id.item_image);
                holder.name = (TextView) v.findViewById(R.id.item_name);

            holder.image = (ImageView) v.findViewById(R.id.item_image);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }


            GridItem item = mGridData.get(position);
            Picasso.with(mContext)
                    .load(item.getImage())
                    .placeholder(R.drawable.placeholder)
                    .fit()
                    .into(holder.image);
            holder.name.setText(item.getName());


        return v;
    }

    class ViewHolder {
        ImageView image, icon;
        TextView name;
    }

}
Pojo:

public class GridItem {
    private String nameUrls, imageUrls, sportsCat, userId;

    public GridItem() {
        super();
    }

    public String getImage() {
        return imageUrls;
    }

    public void setImage(String imageUrls) {
        this.imageUrls = imageUrls;
    }

    public String getName() {
        return nameUrls;
    }

    public void setName(String nameUrls) {
        this.nameUrls = nameUrls;
    }

    public String getSportsCat(){
        return sportsCat;
    }

    public void setSportsCat(String sportsCat){
        this.sportsCat = sportsCat;
    }

    public String getUserId(){
        return userId;
    }

    public void setUserId(String userId){
        this.userId = userId;
    }
}

【问题讨论】:

  • 你的 json 响应在哪里?也提供这个
  • 请查看我编辑的帖子。它包含链接。
  • 您需要检查头像标签是否存在?让我添加答案
  • 是的。检查“profile_picture”json 标签是否存在,如果不存在则添加默认图像。
  • 检查我添加的答案。

标签: android json android-volley android-gridview


【解决方案1】:

你需要像这样检查字符串

String profile_picture = "";
if(json_data.has("profile_picture")){
    profile_picture = json_data.getString("profile_picture");
}else{
    profile_picture = "";
}

您的 newItem 为空。

你需要先在 for 循环中像这样初始化它

newItem = new GridItem();

【讨论】:

  • 仍然收到 NullPointerException 及其在“newItem.setName(name);”行中。
  • 第 92 行是什么
  • 同时更新代码。我想看看你是如何添加我告诉的条件的
  • 行号92 是相同的,这导致了错误。 “newItem.setName(名称);” @Mustanser
  • 谢谢。你是最棒的。
【解决方案2】:

试试这个怎么样,而不是检查个人资料图片是否为空,而是检查 JSON 是否包含 profile_picture 示例

  If (!json_data.has("profile_picture"))){

                                    //String image_def = String.valueOf(R.drawable.default_profile);
                                    Uri path = Uri.parse("android.resource://com.sam.fitlincsearch/" + R.drawable.default_profile);
                                    String image_def = path.toString();
                                    newItem.setImage(image_def);
                                }else{
                                    newItem.setImage(json_data.getString("profile_picture");
                                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多