【问题标题】:How do I get a list of Countries, States and Cities from this JSON?如何从此 JSON 中获取国家、州和城市的列表?
【发布时间】:2018-06-18 00:19:31
【问题描述】:

我有一个 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);

非常感谢任何帮助。

【问题讨论】:

    标签: android json


    【解决方案1】:

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

    概述。

    1. 让我们为您的对象建模
    2. 让我们将原始 json 反序列化为“对象”
    3. 然后我们可以“查询”我们的建模对象!

    第 1 步 - 建模。

    请注意,我不包括构造函数、getter、setter 和任何其他样板。

    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

    第 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. 
    

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

    【讨论】:

      【解决方案2】:

      这是另一种解决方案,对 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-20
        • 2013-02-08
        • 2019-05-27
        • 2013-11-13
        • 2021-11-23
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多