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

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;
    }
	@Override
	public 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 stub
		String 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值