org.json.JSONException:opening_hours没有值,如何处理这种类型的错误

时间:2018-07-24 11:58:38

标签: json parsing android-volley

logcat屏幕截图 logcat screenshot

**解析json后,如果open_hours没有值,则什么也没有显示如何处理,请帮帮我。 url =“ https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJoTjQ-EC_wjsRjC-0kVQOIg0&key=API_KEY” **

  

我做了所有技巧,但没有成功,请帮助我解决此错误

public class Details extends AppCompatActivity {
    private ImageView image_details, open, close;
    private TextView text_mobile, openNow;
    private RequestQueue mRequestQueue;
    String place_id, img_url, mobile, open_now;
    ArrayList<DetailsPojo> mDetailsList;
    private Context mContext;
    LinearLayout openingLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
        findViewByIds();
        mRequestQueue = VolleySingleton.getInstance().getRequestQueue();

        Intent intent = getIntent();
        //if (getIntent().hasExtra("PLACE_ID"))
        place_id = intent.getStringExtra("PLACE_ID");
        Toast.makeText(this, "Place ID :" + place_id.toString(), Toast.LENGTH_SHORT).show();
        parseJson();

    }

    private void parseJson() {
        String url = "https://maps.googleapis.com/maps/api/place/details/json?placeid=" + place_id + "&key=" + KEY;
        Log.d("DetailedURL",url);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject resultObject = response.getJSONObject("result");
                    mobile = resultObject.optString("formatted_phone_number", "not available");

                    if (resultObject.has("formatted_phone_number")) {

                        text_mobile.setText(mobile);
                    } else {
                        text_mobile.setText("not available");
                    }

                    JSONObject openingObject = resultObject.getJSONObject("opening_hours");
                    open_now = openingObject.optString("open_now", "Not provided");
                    if(resultObject.has("opening_hours")) {
                        if (open_now.equalsIgnoreCase("true")) {
                            open.setVisibility(View.VISIBLE);
                            openNow.setText("Open");
                        } else {
                            close.setVisibility(View.VISIBLE);
                            openNow.setText("Closed");
                        }
                    }else {
                        openNow.setText("no information provided for Open/Close");
                    }



                    if(resultObject.has("photos")){
                        JSONArray photosArray = resultObject.getJSONArray("photos");
                        for (int i = 0; i < photosArray.length(); i++) {
                            JSONObject photosObject = photosArray.getJSONObject(i);
                            img_url = URL_PHOTO + photosObject.optString("photo_reference","No image available") + "&key=" + KEY;

                            if (img_url.isEmpty()) {
                                image_details.setImageResource(R.drawable.hospital);
                            } else {
                                Picasso.with(mContext).load(img_url).fit().centerInside().into(image_details);
                            }

                        }
                    }else{
                        image_details.setImageResource(R.drawable.no_image_available);
                    }


                    //  mDetailsList.add(new DetailsPojo(img_url));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        mRequestQueue.add(request);
    }


    private void findViewByIds() {
        image_details = findViewById(R.id.image_view);
        open = findViewById(R.id.open);
        close = findViewById(R.id.closed);
        text_mobile = findViewById(R.id.text_mobile);
        openNow = findViewById(R.id.text_open_now);
        openingLayout=findViewById(R.id.Openinglayout);
    }
}

1 个答案:

答案 0 :(得分:1)

请检查您的console.log(document.querySelectorAll('#foo')[0].classList); // prints list of element possible classes 来自Google API https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJoTjQ-EC_wjsRjC-0kVQOIg0&key=AIzaSyBB8VIJUlcVwYC2EnEQATSMIa9S1cDguDg

正如您在JSON中看到的那样,它说“ opening_hours”没有值。
&您正在尝试获取该JSONObject,而不检查它是否存在。

在这里您可以看到您的代码:-

Logcat

因此,首先根据文档验证它是否来了,如果映射不能顺利进行,它甚至可能引发异常。

https://developer.android.com/reference/org/json/JSONObject#getJSONObject(java.lang.String)