移动应用开发实践-Task5-通过Json获取城市列表
目标
封装一个Json转City类的JsonUtil方法,调用来获得指定url的city列表对象。
json数据来源:http://guolin.tech/api/china
1.City类
在Task4基础上增加了parentId、enName、initialName属性,和相关 get 和 set 方法。
public class City {
private int id;
private String name;
private int parentId = -1;
private String enName = "";
private String initialName = "";
public City(int id, String name) {
this.id = id;
this.name = name;
}
public City(int id, int parentId, String enName) {
this.id = id;
this.parentId = parentId;
this.enName = enName;
}
@Override
public String toString() {
return String.format("%s( %s )-id=%d", name, enName, id);
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public String getEnName() {
return enName;
}
public void setEnName(String enName) {
this.enName = enName;
}
public String getInitialName() {
return initialName;
}
public void setInitialName(String initialName) {
this.initialName = initialName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.JsonUtil工具类(核心代码)
用的是Task3的第二种方法:gson的单个获取(gson单个json目标转换的简单应用)
Task3链接:https://blog.csdn.net/Biu_Destiny/article/details/114660906
import ...
public class JsonUtil {
public static List<City> getCityListFromJson(String json, int parentId) {
//by native Json
ArrayList<City> cityList = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
String s1 = jsonArray.get(i).toString();
//ORM 将json对象通过Gson转为City类对象
City city = new Gson().fromJson(s1, City.class);
city.setParentId(parentId);
//获取城市名称
String name = city.getName();
//转换拼音
city.setEnName(PinyinUtil.ToPinyin(name).trim());
city.setInitialName(PinyinUtil.ToPinyinFirstLetter(name));
//添加city到列表
cityList.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
return cityList;
}
}
3.MainActivity调用工具类
import ...
public class MainActivity extends AppCompatActivity {
EditText editText;
ArrayAdapter<City> adapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
editText = findViewById(R.id.et_url);
listView = findViewById(R.id.listView);
Button button = findViewById(R.id.bt_getCityList);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = editText.getText().toString().trim();
HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
@Override
public void onFailure(String e) {
}
@Override
public void onResponse(String s) {
List<City> list = JsonUtil.getCityListFromJson(s, -1);
updateListView(list);
}
});
}
});
}
private void updateListView(List<City> list) {
adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, list);
listView.setAdapter(adapter);
}
}