《老罗Android》学习之JSON数据解析(二)

来源:互联网 发布:p2p网络理财产品排行 编辑:程序博客网 时间:2024/05/17 19:59
1.  Android客户端访问服务器的JSON数据

 服务器端实现:把一个对象生成Json字符串;    客户端实现:将Json字符串还原成原先的对象.

 1. 建立Android工程。
 2. 新建包,添加JsonActivity.java,实现访问功能。

public class JsonActivity extends Activity implements OnClickListener{private Button person, persons, liststring, listmap;private static final String TAG = "Main";    @SuppressLint("NewApi")@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_json);        person = (Button) this.findViewById(R.id.person);persons = (Button) this.findViewById(R.id.persons);liststring = (Button) this.findViewById(R.id.liststring);listmap = (Button) this.findViewById(R.id.listmap);person.setOnClickListener( this);persons.setOnClickListener(this);liststring.setOnClickListener(this);listmap.setOnClickListener(this);StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.json, menu);        return true;    }@Overridepublic void onClick(View v) {switch (v.getId()) {//检测点击的是哪个按键case R.id.person:String path = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=person";String jsonString = HttpUtils.getJsonContent(path);Log.i(TAG, jsonString);Person person = JsonTools.getPerson("person", jsonString);Log.i(TAG, person.toString());break;case R.id.persons:String path2 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=persons";String jsonString2 = HttpUtils.getJsonContent(path2);List<Person> list2 = JsonTools.getPersons("persons", jsonString2);Log.i(TAG, list2.toString());break;case R.id.liststring:String path3 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=liststring";String jsonString3 = HttpUtils.getJsonContent(path3);List<String> list3 = JsonTools.getList("liststring", jsonString3);Log.i(TAG, list3.toString());break;case R.id.listmap:String path4 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=listmap";String jsonString4 = HttpUtils.getJsonContent(path4);List<Map<String, Object>> list4 = JsonTools.listKeyMaps("listmap",jsonString4);Log.i(TAG, list4.toString());break;}}}
 3. 客户端要实现服务器端对应的类:person.java,JsonTools.java,HttpUtils.java.实现对应的解析功能。Person.java:主要是构造函数改一下,其它不变。
public Person(int id, String name, String address) {super();this.id = id;this.name = name;this.address = address;}
HttpUtils.java:从服务器取得Json数据,并转换成String.
public class HttpUtils {public HttpUtils() {}public static String getJsonContent(String url_path) {try {URL url = new URL(url_path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(3000);connection.setRequestMethod("GET");connection.setDoInput(true);int code = connection.getResponseCode();if (code == 200) {return changeInputStream(connection.getInputStream());}} catch (Exception e) {}return "";}private static String changeInputStream(InputStream inputStream) {// TODO Auto-generated method stubString jsonString = "";ByteArrayOutputStream outputStream = new ByteArrayOutputStream();int len = 0;byte[] data = new byte[1024];try {while ((len = inputStream.read(data)) != -1) {outputStream.write(data, 0, len);}jsonString = new String(outputStream.toByteArray());} catch (IOException e) {e.printStackTrace();}return jsonString;}}
JsonTools.java:解析JSON
public class JsonTools {public JsonTools() {}public static Person getPerson(String key, String jsonString) {Person person = new Person();try {JSONObject jsonObject = new JSONObject(jsonString);//{"person":{"address":"beijing","id":1001,"name":"jack"}}JSONObject personObject = jsonObject.getJSONObject("person");//取出这个key,后面再当成一个JSOn:{"address":"beijing","id":1001,"name":"jack"}person.setId(personObject.getInt("id"));person.setName(personObject.getString("name"));person.setAddress(personObject.getString("address"));} catch (Exception e) {// TODO: handle exception}return person;}        //{"persons":[{"address":"guangxi","id":1001,"name":"jack"},{"address":"guangdong","id":1002,"name":"rose"}]} public static List<Person> getPersons(String key, String jsonString) {List<Person> list = new ArrayList<Person>();try {JSONObject jsonObject = new JSONObject(jsonString);// ����json������JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Person person = new Person();person.setId(jsonObject2.getInt("id"));person.setName(jsonObject2.getString("name"));person.setAddress(jsonObject2.getString("address"));list.add(person);}} catch (Exception e) {}return list;}        //{"liststring":["beijing","shanghai","hunan"]} public static List<String> getList(String key, String jsonString) {List<String> list = new ArrayList<String>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {String msg = jsonArray.getString(i);list.add(msg);}} catch (Exception e) {}return list;}        //{"listmap":[{"id":1001,"address":"beijing","name":"jack"},{"id":1002,"address":"shanghai","name":"rose"}]} public static List<Map<String, Object>> listKeyMaps(String key,String jsonString) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Map<String, Object> map = new HashMap<String, Object>();Iterator<String> iterator = jsonObject2.keys();while (iterator.hasNext()) {String json_key = iterator.next();Object json_value = jsonObject2.get(json_key);if (json_value == null) {json_value = "";}map.put(json_key, json_value);}list.add(map);}} catch (Exception e) {}return list;}}
在手机端点击按钮,就会打印出相应的Log信息,把JSON数据解析 出来。
4. 期间,遇到一个问题:执行到 HTTPUtils中的   getResponseCode(); 取得返回码时,就地崩溃。
找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
并且在配置文件中将SDK的最低等级设为11。


0 0