如何从这个JSON获得国家,州和城市的列表?

时间:2018-06-16 02:00:16

标签: android json

我有一个JSON,其中包含国家/地区的名称,州和州。这是json

我能够获得所有国家,但我无法弄清楚如何根据选定的国家/地区以及基于所选州的城市获取州。

以下是我获得这些国家的方式。enter code here

首先从资产加载文件:

public String loadJSONFromAsset() {
    String json = null;
    try {
        InputStream is = getAssets().open("Contries.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;
}

然后将国家/地区加载到ArrayList。

public void loadCountries(String parent, String child, ArrayList<String> listValue)
{
    try {

        JSONObject obj = new JSONObject(loadJSONFromAsset());
        JSONArray m_jArry = obj.getJSONArray(parent);;
        ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> m_li;

      //  listValue = new ArrayList<>();

        for (int i = 0; i < m_jArry.length(); i++) {
            JSONObject jo_inside = m_jArry.getJSONObject(i);

            listValue.add(jo_inside.getString(child));
        }


    } catch (JSONException e) {

        e.printStackTrace();
    }


}

然后这行终于:

loadCountries("Countries", "CountryName", countries);

选择国家/地区后,我想加载其状态。也许是这样的:

loadCountries("Pakistan", "StateName", states);

然后:

loadCountries("Islamabad Capital Territory", "CityName", cities);

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

使用JSON可能容易出错。为什么我们不在数据周围建模对象,我们可以做一些更清晰的事情。

概述。

  1. 让我们为你的物品建模
  2. 让我们将原始json反序列化为“Objects”
  3. 然后我们可以“查询”我们的建模对象!
  4. 第1步 - 建模。

    注意我不包括构造函数,吸气剂,定位器和任何其他锅炉板。

    public class Country {
       private List<State> states;
       private String name;
    
       public Optional<State> getStateByName(String name) {
          return States.stream().filter(state -> state.getName().equals(name)).findFirst();
       }
    }
    public class State {
       private List<String> cities;
       private String name;
    
       public Optional<String> getCityByName(String name) {
          return cities.stream().filter(city -> city.equals(name)).findFirst();
       } 
    }
    
    public class CountryDataProvider  {
        private List<Country> countries;
    
        public CountryDataProvider(String rawData) {
          // parse your json to create a List of object Country (tip: Use something like Jackson or Gson to do this for you). 
          // Ref to part 2
        }
        public Optional<Country> getCountryByName(String name) {
           return countries.stream().filter(country -> country.getName().equals(name)).findFirst();
        }
    }
    

    第2步 - 反序列化。

    这是一个广泛的主题。说实话,有很多库可以做得更好,而且它们很容易添加到您的项目中。以下是一些:

    1. 杰克逊https://github.com/FasterXML/jackson
    2. GSON https://github.com/google/gson&lt; - 我的选择。
    3. 第3步 - 查询

      从这里你可以做你想做的事

      countryData = new CountryDataProvider(data);
      Optional<List<String>> countriesInPunjab = countryData.getCountryByName("Pakistan")
          .map(country -> country.getStateByName("Punjab")
          .map(state -> state.getCities()); // would give you all the cities in Punjab, Pakistan. 
      

      我在我的示例中给出的代码确实使用了functional和Optional接口(在Java 8中)。如果您希望以较少功能的方式重写它们,请告诉我。

答案 1 :(得分:0)

这是另一个解决方案,不是非常适合CPU,但它可以工作:

首先使用此方法获取国家/地区列表:

 public void loadCountries(String parent, String child, ArrayList<String> listValue)
{
    try {

        JSONObject obj = new JSONObject(loadJSONFromAsset());
        JSONArray m_jArry = obj.getJSONArray(parent);
       // m_jArry;
        ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> m_li;

      //  listValue = new ArrayList<>();

        for (int i = 0; i < m_jArry.length(); i++) {
            JSONObject jo_inside = m_jArry.getJSONObject(i);

            listValue.add(jo_inside.getString(child));
        }


    } catch (JSONException e) {

        e.printStackTrace();
    }


}

像这样调用这个方法:

loadCountries("Countries", "CountryName", countries);

然后使用以下方法加载州和城市。

private void getCitiesByState(String countryName, String stateName)
{
    try {

        JSONObject json = new JSONObject(loadJSONFromAsset());
        JSONArray countriesArray = json.getJSONArray("Countries");

        for(int i = 0; i < countriesArray.length(); i++)

        {
            JSONObject countryJSON = countriesArray.getJSONObject(i);

            if(countryJSON.getString("CountryName").equals(countryName))
            {
                JSONArray statesArray = countryJSON.getJSONArray("States");

                states.clear();

                for(int j = 0; j < statesArray.length(); j++)
                {
                    JSONObject statesJSON = statesArray.getJSONObject(j);
                    states.add(statesJSON.getString("StateName"));

                    if(statesJSON.getString("StateName").equals(stateName))
                    {

                        JSONArray citiesarray = statesJSON.getJSONArray("Cities");
                        cities.clear();


                        for(int k = 0; k < citiesarray.length(); k++)
                        {
                         cities.add(citiesarray.getString(k));
                        }
                    }
                }


            }
        }

    } catch (JSONException e) {

        e.printStackTrace();
    }
}