需要有关JSON解析的帮助

时间:2013-08-18 19:39:34

标签: android json android-listview arrays

我的json文件是这样的:

{
   "shops": [
      {
         "id": "11",
         "name": "Next",
         "description": "Opened in 2005, offers a selection of clothes, shoes and accessories.",
         "url": "/shop/550/127",
         "categories": [
            "4",
            "33",
            "34",
            "16"
         ],
         "bg_image": "/uploads/static/shop/460px/2012/12/5385-127-sale.jpg"
      },
.....

我想根据类别使用“类别”来获取这些商店。例如,如果男士牛仔裤从列表中点击,那么与该类别相关联的所有商店都显示为列表。而这个JSON文件存储在sdcard中。目前,如果单击列表项,我可以获取所有商店。但我无法根据类别进行过滤。

Jean.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import com.kabelash.sg.util.ExternalStorage;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class Jeans extends Activity {
    private final String JSON_file = "api_output_example.json";
    File jsonFile;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.baby1_1);

        /** Getting Cache Directory */
        File cDir = ExternalStorage.getSDCacheDir( this, "json_files" );

        /** Getting a reference to temporary file, if created earlier */
        jsonFile = new File(cDir.getPath() + "/" + JSON_file) ;

        String strLine="";
        StringBuilder strJson = new StringBuilder();

        /** Reading contents of the temporary file, if already exists */
        try {
            FileReader fReader = new FileReader(jsonFile);
            BufferedReader bReader = new BufferedReader(fReader);

            /** Reading the contents of the file , line by line */
            while( (strLine=bReader.readLine()) != null  ){
                strJson.append(strLine);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }


     //System.out.println(strJson);

        /** Start parsing JSON data */
        new ListViewLoaderTask().execute(strJson.toString());

    }


    private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{

        JSONObject jObject;
        /** Doing the parsing of JSON data in a non-ui thread */
        @Override
        protected SimpleAdapter doInBackground(String... strJson) {
            try{
                jObject = new JSONObject(strJson[0]);
                CountryJSONParser countryJsonParser = new CountryJSONParser();
                countryJsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("JSON Exception1",e.toString());
            }

            CountryJSONParser countryJsonParser = new CountryJSONParser();

            List<HashMap<String, String>> shops = null;

            try{
                /** Getting the parsed data as a List construct */
                shops = countryJsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("Exception",e.toString());
            }

            /** Keys used in Hashmap */
            String[] from = { "shop","image","description"};

            /** Ids of views in listview_layout */
            int[] to = { R.id.tv_country,R.id.iv_flag,R.id.tv_country_details};

            /** Instantiating an adapter to store each items
            *  R.layout.listview_layout defines the layout of each item
            */
            SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), shops, R.layout.lv_layout, from, to);

            return adapter;
        }

        /** Invoked by the Android system on "doInBackground" is executed completely */
        /** This will be executed in ui thread */
        @Override
        protected void onPostExecute(SimpleAdapter adapter) {

            /** Getting a reference to listview of main.xml layout file */
            ListView listView = ( ListView ) findViewById(R.id.lv_countries);

            /** Setting the adapter containing the country list to listview */
            listView.setAdapter(adapter);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

countryJSONParser.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class CountryJSONParser {

    /** Receives a JSONObject and returns a list */
    public List<HashMap<String,String>> parse(JSONObject jObject){      

        JSONArray jShops = null;
        try {           
            /** Retrieves all the elements in the 'countries' array */
            jShops = jObject.getJSONArray("shops");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        /** Invoking getShops with the array of json object
         * where each json object represent a country
         */
        return getShops(jShops);
    }


    private List<HashMap<String, String>> getShops(JSONArray jShops){
        int shopCount = jShops.length();
        List<HashMap<String, String>> shopList = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> shop = null;    

        /** Taking each shop, parses and adds to list object */
        for(int i=0; i<shopCount;i++){
            try {
                /** Call getShop with shop JSON object to parse the shop */
                shop = getShop((JSONObject)jShops.get(i));
                shopList.add(shop);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        return shopList;
    }

    /** Parsing the shop JSON object */
    private HashMap<String, String> getShop(JSONObject jShop){

        HashMap<String, String> shop = new HashMap<String, String>();
        String shopName = "";
        String image="";
        String description = "";
        String categories = "";
        //String capital = "";      

        try {
            shopName = jShop.getString("name");
            image = jShop.getString("bg_image_small");
            description = jShop.getString("description");
            categories = jShop.getString("categories");

            String details =        "Description : " + description;
            //if (categories.equals("11")){
            shop.put("shop", shopName);
            shop.put("image", image);
            shop.put("description", details);
            shop.put("categories", categories);
            //}
        } catch (JSONException e) {         
            e.printStackTrace();
        }       
        return shop;
    }
}

上面给出的代码工作正常,但我想知道如何过滤它。我想使用“bg_image”链接在listview上显示图像(图像存储在SD卡上)。有人可以根据我的要求编辑这段代码吗? (遗憾的是我在Google上找不到任何有用的东西)。请帮忙!

编辑:现在我尝试做这样的事情,但是做不到。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ShopJSONParser {
    public class Shop { 
        public String name;
        public String category;
        public String description;
        public String image;
        public ArrayList<String> category_list;
    } 
    /** Receives a JSONObject and returns a list */
    public List<HashMap<String,String>> parse(JSONObject jObject){      

        JSONArray jShops = null;
        try {           
            // Retrieves all the elements in the 'shops' array
            jShops = jObject.getJSONArray("shops");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        // Invoking getShops with the array of json object
        // where each json object represent a shop
        return getShops(jShops);
    }

    ArrayList<Shop> shops_array = new ArrayList<Shop>();
    private List<HashMap<String, String>> getShops(JSONArray jShops){
        int shopCount = jShops.length();
        List<HashMap<String, String>> shopList = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> shop = null;    

        /** Taking each shop, parses and adds to list object */
        for (int i = 0; i < jShops.length(); i++) {
            JSONObject Shop_json_obj = jShops.getJSONObject(i);
            Shop shop1 = new Shop();

            String name = Shop_json_obj.getString("name");
            String description = Shop_json_obj.getString("description");

            shop1.name = name;
            shop1.description = description;

            shop1.category_list = new ArrayList<String>();
            JSONArray categories_json_array = null;

            categories_json_array = shop1.getJSONArray("categories");

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

                String cat = categories_json_array.getString(j);
                shop1.category_list.add(cat);
            }

            shops_array.add(shop1);

        }

        return shopList;
    }

    /** Parsing the shop JSON object */
    private HashMap<String, String> getShop(JSONObject jShop){

        HashMap<String, String> shop = new HashMap<String, String>();
        String shopName = "";
        String image="";
        String description = "";
        String categories = "";

        try {
            shopName = jShop.getString("name"); 
            image = jShop.getString("bg_image_small");
            description = jShop.getString("description");
            categories = jShop.getJSONArray("categories").toString();
            System.out.println(categories);
            String details =        "Description : " + description;
            //if (categories.equals("13")){
            shop.put("shop", shopName);
            shop.put("image", image);
            //shop.put("description", details);
            //shop.put("categories", categories);
            //}
        } catch (JSONException e) {         
            e.printStackTrace();
        }       
        return shop;
    }
}

需要进一步的帮助。感谢。

1 个答案:

答案 0 :(得分:1)

首先,我认为你解析错了。当你将它解析为字符串时,'categories'是JsonArray。你应该把它作为一个数组。所以,它基本上是一个数组内的数组。完成后,您可以根据类别值轻松地将单个项目标记为适当的类别。

修改:

更好的方法是创建具有所需属性的Shop对象,然后在JSON解析函数中填充Shop对象列表。例如

public class Shop{

    public String name;
    public String description;
    public String image;
    public ArrayList<String> category_list;

    public Shop(){
        category_list = new ArrayList<String>();
    }

}  

这是您修改过的CountryJSONParser:

import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class CountryJSONParser {

    /** Receives a JSONObject and returns a list */
    public ArrayList<Shop> parse(JSONObject jObject){      

        JSONArray jShops = null;
        try {           
            /** Retrieves all the elements in the 'countries' array */
            jShops = jObject.getJSONArray("shops");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        /** Invoking getShops with the array of json object
         * where each json object represent a country
         */
        return getShops(jShops);
    }

    private ArrayList<Shop> getShops(JSONArray jShops){
        int shopCount = jShops.length();
        ArrayList<Shop> shops_array = new ArrayList<Shop>();
        Shop shop = new Shop();

        /** Taking each shop, parses and adds to list object */
        for(int i=0; i<shopCount;i++){
            try {
                /** Call getShop with shop JSON object to parse the shop */
                shop = getShop((JSONObject)jShops.get(i));
                //shopList.add(shop);
                shops_array.add(shop);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        return shops_array;
    }

    /** Parsing the shop JSON object */
    private Shop getShop(JSONObject jShop){

        Shop shop = new Shop();   

        try {
        shop.name = jShop.getString("name");
            shop.image = jShop.getString("bg_image_small");
            String details =        "Description : " + shop.description;
            shop.description = details;

            shop.category_list = new ArrayList<String>();
            JSONArray categories_json_array = null;

            categories_json_array = jShop.getJSONArray("categories");

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

                String cat = categories_json_array.getString(j);
                shop.category_list.add(cat);
            }

        } catch (JSONException e) {         
            e.printStackTrace();
        }       
        return shop;
    }  
}