Android : How to use JsonUtil get infomation from server
สำหรับใครที่กำลังมองหาวิธีการดึงข้อมูลจากเซิร์ฟเวอร์ซึ่งมีหลายแนวทาง ไม่ว่าจะใช้ HttpConnect, JsonUtil, XML, etc. วันนี้มาแนะนำหนึ่งในทางเลือกคือ JsonUtil โดยแนวทางจะมีสองฝั่งต้องส่งและรับข้อมูลให้สัมพันธ์กัน ดังตัวอย่าง
1. ฝั่งเซิร์ฟเวอร์ (Server)
ฝั่งเซิร์ฟเวอร์เราก็ต้องตัดข้อมูลที่จะส่งพร้อมกับระบุหัวข้อของข้อมูล เช่น เราต้องการส่งข้อมูล
ชื่อ(name), นามสกุล(lname), อายุ(age) โดย query มาจากฐานข้อมูลในส่วนของเซิร์ฟเวอร์เราจะเตรียมโค้ดดังนี้
1.1 query code
$query=”select name,lname,age from tbl_account” ; |
1.2 convert to json format
$res = mysql_query($query); $total_records = mysql_num_rows($res);if($total_records >= 1){ while ($link = mysql_fetch_array($res, MYSQL_ASSOC)){ $set[‘jsonArray’][] = $link; } } echo $val= str_replace(‘\\/’, ‘/’, json_encode($set)); |
Note: jsonArray เป็นชื่อ array ที่เราจะต้องกำหนดใน application เรากำหนดเองได้
ตัวอย่างข้อมูลแบบ 1 record ถ้ามีหลาย records ก็จะคั่นด้วย comma ไปเรื่อยๆ
{“jsonArray “:[{“name”:”surachai”,”lname”:”boonmakmak”,”age”:”24″}]} |
2. ฝั่งแอปปลิเคชัน (Android Application)
ในส่วนของแอนดรอย์เราจะเพิ่มโค้ดดังนี้
2.1 รัน JsonUtil connect to server url
if (JsonUtils.isNetworkAvailable(this)) { String url = "http://www.myappserv.com/getacc.php; new MyTask().execute(url); } |
2.2 สร้าง class MyTask()
private class MyTask extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... params) { return JsonUtils.getJSONString(params[0]); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (null == result || result.length() == 0) { showToast("No data!!!"); } else { try { JSONObject mainJson = new JSONObject(result); JSONArray jsonArray = mainJson.getJSONArray('jsonArray'); JSONObject objJson = null; for (int i = 0; i < jsonArray.length(); i++) { objJson = jsonArray.getJSONObject(i); // define variable String v_name = objJson.getString('name'); String v_lname = objJson.getString('lname'); String v_age = objJson.getString('age'); } } catch (JSONException e) { e.printStackTrace(); } } } } |
ตรงที่กำหนดเป็นตัวหนาชื่อฟิลด์จะต้องตรงกับที่เซิร์ฟเวอร์ส่งมา ทั้งชื่อ array (ในตัวอย่างคือ jsonArray) ชื่อฟิลด์ (ในตัวอย่างมี name, lname, age)
นอกจากนี้ในตัวอย่างเป็นการประกาศ String v_name, v_lname, v_age มารับค่า ซึ่งจะรับได้เพียงค่าเดียวคือค่าสุดท้ายโดยในตัวอย่างส่งมาเพียง 1 record เลยใช้ String รับ แต่ถ้ากรณีมีหลาย records จะต้องประกาศตัวแปรเป็น array แล้วรับค่ามาเก็บไว้ถึงจะได้ครบนะครับ