如何在json中访问对象>数组>对象>数组>对象?

时间:2016-08-22 10:37:45

标签: android json

我必须通过url中的json获取文本。

层次结构如下:

对象>&阵列GT;对象>&阵列GT;对象

我希望使用此代码获取文字。但我收到错误:org.json.JSONException: No value for text

以下是代码: -

public class ListViewActivity extends Activity {
    // Log tag
    private static final String TAG = ListViewActivity.class.getSimpleName();
    // change here url of server api
    private static final String url = "http://2e9b8f52.ngrok.io/api/v1/restaurants?per_page=5&km=1&location=true&lat=19.0558306414&long=72.8339840099";
    private ProgressDialog pDialog;
    private List<Movie> movieList = new ArrayList<Movie>();
    private ListView listView;
    private CustomListAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        listView = (ListView) findViewById(R.id.list);
        adapter = new CustomListAdapter(this, movieList);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Movie movie = movieList.get(position);
                Intent intent = new Intent(ListViewActivity.this, SecondActivity.class);
                intent.putExtra("name", movie.getName());
                intent.putExtra("average_ratings", movie.getAverage_ratings());
                intent.putExtra("full_address", movie.getAddress());
                intent.putExtra("image_url", movie.getThumbnailUrl());
                intent.putExtra("cuisine",movie.getCuisine());
                intent.putExtra("cost",movie.getCost());
                startActivity(intent);

            }
        });
        listView.setAdapter(adapter);
        pDialog = new ProgressDialog(this);
        // Showing progress dialog before making http request
        pDialog.setMessage("Please Keep patience.Its loading...");

        pDialog.show();

        // Creating volley request obj
        JsonObjectRequest movieReq = new JsonObjectRequest(Request.Method.GET,
                url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
                JSONArray

                        restaurantsJSONArray= null;
                try {
                    restaurantsJSONArray = response.getJSONArray("restaurants");
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                hidePDialog();
                // Parsing json
                for (int i = 0; i < restaurantsJSONArray.length(); i++) {
                    try {

                        JSONObject obj =restaurantsJSONArray.getJSONObject(i);
                        Movie movie = new Movie();
                        //movie.setTitle(obj.getString("title"));
                        movie.setName(obj.getString("name"));
                        //movie.setThumbnailUrl(obj.getString("image"));
                        movie.setThumbnailUrl(obj.getString("org_image_url"));
                        movie.setAverage_ratings(obj.getString("average_ratings"));
                        movie.setCuisine(obj.getString("cuisine"));
                        movie.setAddress(obj.getJSONObject("address").getString("area"));
                        // movie.setAddress(obj.getJSONObject("address").getString("full_address"));
                        movie.setCost(obj.getString("cost"));
                        movie.setDistance( obj.getDouble("distance"));
                        movie.settext(obj.getString("text"));
                        movieList.add(movie);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                adapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hidePDialog();

            }
        });


        AppController.getInstance().addToRequestQueue(movieReq);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        hidePDialog();
    }

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }



}

我附上了json数据的快照。在快照中,我们可以看到颜色&#34;文字= 15%的折扣&#34;我必须访问。enter image description here

4 个答案:

答案 0 :(得分:2)

  web_server_scaleup_policy:
    type: OS::Heat::ScalingPolicy
    properties:
      adjustment_type: change_in_capacity
      auto_scaling_group_id: {get_resource: webserver}
      cooldown: 60
      scaling_adjustment: 1

你可以这样解析。使用这个类你可以解析任何类型的层次结构。

答案 1 :(得分:1)

        JSONArray restaurantsJSONArray= null;
                        try {
                            restaurantsJSONArray = response.getJSONArray("restaurants");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        hidePDialog();
                        // Parsing json
                        for (int i = 0; i < restaurantsJSONArray.length(); i++) {
                            try {

                                JSONObject obj =restaurantsJSONArray.getJSONObject(i);
                                Movie movie = new Movie();
                                //movie.setTitle(obj.getString("title"));
                                movie.setName(obj.getString("name"));


     JSONArray    textJSONArray= obj.getJSONArray("restaurant_offers");

     for (int j = 0; j < textJSONArray.length(); j++) {

       JSONObject txtobj =textJSONArray.getJSONObject(i);
     movie.settext(txtobj .getString("text"));
    }      
                                movieList.add(movie);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

尝试此代码restaurant_offers是一个JSONArray,因此您可以像这样解析

答案 2 :(得分:0)

您可以像这样解析

JSONObject apiResponseJsonObject= // Your API Response
        try {

            JSONArray restaurantJSONArray = apiResponseJsonObject.getJSONArray("restaurants");
            // you can get any text from an object like this
            restaurantJSONArray.getJSONObject(index).getString("name");
            restaurantJSONArray.getJSONObject(index).getString("cost"); // Like this

            //If you want to access phone numbers of specific object
            JSONArray phoneJSONArray=restaurantJSONArray.getJSONObject(index).getJSONArray("phone_numbers");
            // And you can get specific data from phoneNumber like this
            phoneJSONArray.getJSONObject(phoneNumberIndex).getString("number");


            //TO get Address, you can use like this
            JSONObject addressJSONObject=restaurantJSONArray.getJSONObject(index).getJSONObject("address");

            //Like this you can parse whatever you want.
        } catch (JSONException e) {
            e.printStackTrace();
        }

答案 3 :(得分:0)

您必须像这样更改for循环内容

JSONObject obj =restaurantsJSONArray.getJSONObject(i);
    JSONArray restauranstOffersJSONArray = obj.getJSONArray("restaurants_offers");
    for (int i = 0; i < restauranstOffersJSONArray.length(); i++) {
        JSONObject offersObj = restauranstOffersJSONArray.get(i);
        String text = offersObj.getString("text");
    }