Nội dung:
- Định dạng JSON
- Đọc json
- Đọc tệp tin json từ internet
---------------------------
1. Định dạng JSON
- JSON (JavaScript Object Notation) được định nghĩa dữ theo ngôn ngữ JavaScript, tiêu chuẩn ECMA-262 năm 1999, cấu trúc là một định dạng văn bản đơn giản với các trường dữ liệu được lồng vào nhau.
- Ví dụ về 1 định dạng JSON:
- Việc đọc và ghi định dạng JSON được tích hợp sẵn trong Android SDK (dùng thư viên org.json.*) :
+ JSONObject: đối tượng quản lý JSON ở dạng một Object.
+ JSONArray: đối tượng quản lý JSON ở dạng tập mảng.
2. Đọc JSON:
Các bước cơ bản đọc định dạng JSON vào mảng:
//1. Khai báo đối tượng json root object
JSONObject jsonRootObject = new JSONObject(jsonStr);
//2. Đưa jsonRootObject vào array object
JSONArray jsonArray = jsonRootObject.optJSONArray("Employee");
//
//3. Duyệt từng đối tượng trong Array và lấy giá trị ra
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);//lấy từng đối tượng ra
String value = jsonObject.optString("key_name").toString());//
//...
}
Ví dụ: Đọc và hiển thị một chuỗi định dạng JSON lên textview
Cho chuỗi JSON như ở ví dụ trên:
String jsonStr =
"{" +
"\"Employee\": [" +
"{" +
"\"id\":\"01\"," +
"\"name\":\"Nguyen Van A\"," +
"\"salary\":\"1000\"" +
"}," +
"{" +
"\"id\":\"02\"," +
"\"name\":\"Nguyen Van B\"," +
"\"salary\":\"2000\"" +
"}," +
"{" +
"\"id\":\"03\"," +
"\"name\":\"Nguyen Van C\"," +
"\"salary\":\"3000\"" +
"}" +
"]" +
"}";
Kết quả đọc lên textview:
Dùng một textview để hiển thị kết quả
Code java: trong hàm onCreate
Link download bài này:
https://drive.google.com/file/d/0B8tAQ0_sJKCSbGd6OHBqRE93Z0U/view?usp=sharing
3. Đọc tệp tin json từ internet
- Dùng link: http://myjson.com/ để lưu trữ chuỗi JSON lên internet, bấm nut save để lấy link. Ví dụ link sau: https://api.myjson.com/bins/35zd8
- Dùng link: http://jsonlint.com/ để kiểm tra chuỗi JSON có đúng cú pháp hay không.
- Kết quả đọc chuỗi JSON trên:
Về giao diện tạo textview để hiển thị nội dung JSON.
Tệp tin AndroidManifest.xml:
Mã nguồn Java gồm 2 tệp tin: HttpAsyncTask.java kế thừa từ lớp AsyncTask và tệp tin
MainActivity.java
Mã nguồn HttpAsynsTask.java:
Tệp tin MainActivity.java:
Link download bài này:
https://drive.google.com/file/d/0B8tAQ0_sJKCSSG5YeEhmRTVrTkU/view?usp=sharing
Bài tập:
1. Viết ứng dụng xem thời tiết, lấy dữ liệu từ link JSON data cho trước hoặc JSON Weather API từ internet.
Download icon hình ảnh ở đây: https://drive.google.com/file/d/0B8tAQ0_sJKCScW5YQ0NER0EtUUU/view?usp=sharing
Tương tự như bài 10, ở đây có thêm tệp tin HttpAsyncTask.java và sửa lại tệp tin MainActivity.java như sau:
+ HttpAsyncTask.java:
+ MainActivity.java:
2.
- Định dạng JSON
- Đọc json
- Đọc tệp tin json từ internet
---------------------------
1. Định dạng JSON
- JSON (JavaScript Object Notation) được định nghĩa dữ theo ngôn ngữ JavaScript, tiêu chuẩn ECMA-262 năm 1999, cấu trúc là một định dạng văn bản đơn giản với các trường dữ liệu được lồng vào nhau.
- Ví dụ về 1 định dạng JSON:
- Việc đọc và ghi định dạng JSON được tích hợp sẵn trong Android SDK (dùng thư viên org.json.*) :
+ JSONObject: đối tượng quản lý JSON ở dạng một Object.
+ JSONArray: đối tượng quản lý JSON ở dạng tập mảng.
2. Đọc JSON:
Các bước cơ bản đọc định dạng JSON vào mảng:
//1. Khai báo đối tượng json root object
JSONObject jsonRootObject = new JSONObject(jsonStr);
//2. Đưa jsonRootObject vào array object
JSONArray jsonArray = jsonRootObject.optJSONArray("Employee");
//
//3. Duyệt từng đối tượng trong Array và lấy giá trị ra
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);//lấy từng đối tượng ra
String value = jsonObject.optString("key_name").toString());//
//...
}
Ví dụ: Đọc và hiển thị một chuỗi định dạng JSON lên textview
Cho chuỗi JSON như ở ví dụ trên:
String jsonStr =
"{" +
"\"Employee\": [" +
"{" +
"\"id\":\"01\"," +
"\"name\":\"Nguyen Van A\"," +
"\"salary\":\"1000\"" +
"}," +
"{" +
"\"id\":\"02\"," +
"\"name\":\"Nguyen Van B\"," +
"\"salary\":\"2000\"" +
"}," +
"{" +
"\"id\":\"03\"," +
"\"name\":\"Nguyen Van C\"," +
"\"salary\":\"3000\"" +
"}" +
"]" +
"}";
Kết quả đọc lên textview:
Dùng một textview để hiển thị kết quả
Code java: trong hàm onCreate
TextView tv_display =
(TextView) findViewById(R.id.textview_display);
String jsonStr =
"{" +
"\"Employee\":
["
+
"{" +
"\"id\":\"01\"," +
"\"name\":\"Nguyen
Van A\"," +
"\"salary\":\"1000\"" +
"}," +
"{" +
"\"id\":\"02\"," +
"\"name\":\"Nguyen
Van B\"," +
"\"salary\":\"2000\"" +
"}," +
"{" +
"\"id\":\"03\"," +
"\"name\":\"Nguyen
Van C\"," +
"\"salary\":\"3000\"" +
"}" +
"]" +
"}";
String data ="";
try {
//1. Khai báo đối tượng json root object
JSONObject jsonRootObject = new JSONObject(jsonStr);
//2. Đưa jsonRootObject vào array object
JSONArray jsonArray =
jsonRootObject.optJSONArray("Employee");
//
//3. Duyệt từng đối tượng trong Array và lấy
giá trị ra
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject =
jsonArray.getJSONObject(i);
int id = Integer.parseInt(jsonObject.optString("id").toString());
String name =
jsonObject.optString("name").toString();
int salary = Integer.parseInt(jsonObject.optString("salary").toString());
data += id + ", " + name + ", " + salary + "\n";
}
} catch (JSONException e) {
e.printStackTrace();
}
tv_display.setText(data);
Link download bài này:
https://drive.google.com/file/d/0B8tAQ0_sJKCSbGd6OHBqRE93Z0U/view?usp=sharing
3. Đọc tệp tin json từ internet
- Dùng link: http://myjson.com/ để lưu trữ chuỗi JSON lên internet, bấm nut save để lấy link. Ví dụ link sau: https://api.myjson.com/bins/35zd8
- Dùng link: http://jsonlint.com/ để kiểm tra chuỗi JSON có đúng cú pháp hay không.
- Kết quả đọc chuỗi JSON trên:
Về giao diện tạo textview để hiển thị nội dung JSON.
Tệp tin AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
Mã nguồn Java gồm 2 tệp tin: HttpAsyncTask.java kế thừa từ lớp AsyncTask và tệp tin
MainActivity.java
Mã nguồn HttpAsynsTask.java:
package com.readjsonfromurl;
import
java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import
java.io.InputStreamReader;
import
org.apache.http.HttpResponse;
import
org.apache.http.client.HttpClient;
import
org.apache.http.client.methods.HttpGet;
import
org.apache.http.impl.client.DefaultHttpClient;
import
android.app.Activity;
import
android.os.AsyncTask;
import android.util.Log;
import
android.widget.TextView;
import
android.widget.Toast;
public class HttpAsyncTask extends AsyncTask<String,
Void, String> {
Activity contextMain;
public HttpAsyncTask(Activity _context) {
contextMain = _context;
}
@Override
protected String doInBackground(String... urls)
{
return GetStringFromURL(urls[0]);
}
// onPostExecute displays the results of
the AsyncTask.
@Override
protected void onPostExecute(String
result) {
Toast.makeText(contextMain.getBaseContext(),
"Received!", Toast.LENGTH_LONG).show();
TextView tv_display =
(TextView) contextMain.findViewById(R.id.textview_content);
(TextView) contextMain.findViewById(R.id.textview_content);
tv_display.setText(result);
}
public static String
GetStringFromURL(String url){
InputStream inputStream = null;
String result = "";
try {
// create
HttpClient
HttpClient httpclient = new DefaultHttpClient();
// make GET request
to the given URL
HttpResponse httpResponse =
httpclient.execute(new HttpGet(url));
// receive response
as inputStream
inputStream =
httpResponse.getEntity().getContent();
// convert inputstream
to string
if(inputStream != null) {
result = convertInputStreamToString(inputStream);
} else {
result = "Did not work!";
}
} catch (Exception e) {
Log.d("InputStream",
e.getLocalizedMessage());
}
return result;
}
private static String
convertInputStreamToString(InputStream inputStream){
BufferedReader bufferedReader =
new BufferedReader( new
InputStreamReader(inputStream));
String line = "", result = "";
try {
while((line =
bufferedReader.readLine()) != null) {
result += line;
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
Tệp tin MainActivity.java:
package com.readjsonfromurl;
import
android.net.ConnectivityManager;
import
android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import
android.widget.TextView;
import
android.app.Activity;
public class MainActivity extends Activity {
TextView tv_display;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// check if you are connected or not
if(isConnected()){
Log.i("Connect", "You are
conncted");
}
else{
Log.i("Connect", "You are NOT
conncted");
}
HttpAsyncTask httpAsyncTask = new
HttpAsyncTask(MainActivity.this);
httpAsyncTask.execute("https://api.myjson.com/bins/35zd8");
}
public boolean isConnected(){
ConnectivityManager connMgr =
(ConnectivityManager)
getSystemService(Activity.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo =
connMgr.getActiveNetworkInfo();
if (networkInfo != null &&
networkInfo.isConnected()) {
return true;
}
else {
return false;
}
}
}
https://drive.google.com/file/d/0B8tAQ0_sJKCSSG5YeEhmRTVrTkU/view?usp=sharing
Bài tập:
1. Viết ứng dụng xem thời tiết, lấy dữ liệu từ link JSON data cho trước hoặc JSON Weather API từ internet.
Download icon hình ảnh ở đây: https://drive.google.com/file/d/0B8tAQ0_sJKCScW5YQ0NER0EtUUU/view?usp=sharing
Tương tự như bài 10, ở đây có thêm tệp tin HttpAsyncTask.java và sửa lại tệp tin MainActivity.java như sau:
+ HttpAsyncTask.java:
package com.weather_json;
import
android.app.Activity;
import
android.os.AsyncTask;
import android.util.Log;
import
android.widget.Toast;
import
java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import
java.io.InputStreamReader;
import
org.apache.http.HttpResponse;
import
org.apache.http.client.HttpClient;
import
org.apache.http.client.methods.HttpGet;
import
org.apache.http.impl.client.DefaultHttpClient;
public class HttpAsyncTask extends AsyncTask<String,
Void, String> {
Activity
contextMain;
public String strResult = "";
public HttpAsyncTask(Activity _context) {
contextMain = _context;
}
@Override
protected String doInBackground(String... urls)
{
return GetStringFromURL(urls[0]);
}
// onPostExecute displays the results of
the AsyncTask.
@Override
protected void onPostExecute(String
result) {
Toast.makeText(contextMain.getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
strResult = result;
//Gọi hàm Update bên MainActivity.java
((MainActivity) contextMain ).Update();
}
public static String
GetStringFromURL(String url){
InputStream inputStream = null;
String result = "";
try {
// create HttpClient
HttpClient httpclient = new
DefaultHttpClient();
// make GET request to the given URL
HttpResponse httpResponse =
httpclient.execute(new HttpGet(url));
// receive response as inputStream
inputStream =
httpResponse.getEntity().getContent();
// convert inputstream to string
if(inputStream != null) {
result = convertInputStreamToString(inputStream);
} else {
result = "Did not
work!";
}
} catch (Exception e) {
Log.d("InputStream",
e.getLocalizedMessage());
}
return result;
}
private static String
convertInputStreamToString(InputStream inputStream){
BufferedReader bufferedReader =
new BufferedReader( new
InputStreamReader(inputStream));
String line = "", result = "";
try {
while((line =
bufferedReader.readLine()) != null) {
result += line;
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
+ MainActivity.java:
package com.weather_json;
import java.util.ArrayList;
import org.json.JSONArray;
import
org.json.JSONException;
import org.json.JSONObject;
import
android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import
android.view.MenuItem;
import
android.widget.ListView;
public class MainActivity extends Activity {
private ListView myListView;
private MyArrayAdapter myAdapter;
private String jsonStr = "";
ArrayList<Weather> weatherArray;
HttpAsyncTask httpAsyncTask;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView)
findViewById(R.id.mylistView);
httpAsyncTask = new
HttpAsyncTask(MainActivity.this);
httpAsyncTask.execute("https://api.myjson.com/bins/4z4r4");
//create ArrayList
weatherArray = new
ArrayList<Weather>();
/*weatherArray.add(new
Weather("Ha Noi", "Sunny", "32°C",
"sunny"));
weatherArray.add(new
Weather("Quang Binh", "Clou", "31°C",
"sunny"));
weatherArray.add(new
Weather("Hue", "Sunny", "35°C",
"sunny"));
weatherArray.add(new
Weather("Quang Binh", "Sunny", "30°C",
"sunny"));
weatherArray.add(new
Weather("Nha Trang", "Sunny", "29°C",
"sunny"));
weatherArray.add(new
Weather("Phan Thiet", "Sunny", "28°C",
"sunny"));*/
//create adapter
myAdapter = new
MyArrayAdapter(MainActivity.this, R.layout.list_item, weatherArray);
myListView.setAdapter(myAdapter);
}
//Cập nhật
dữ liệu
public void Update() {
jsonStr = httpAsyncTask.strResult;
Log.i("----Json
result:", jsonStr);
try {
JSONObject jsonRootObject = new JSONObject(jsonStr);
JSONArray jsonArray =
jsonRootObject.optJSONArray("Weather");
for(int i = 0; i <
jsonArray.length(); i++) {
JSONObject jsonObject =
jsonArray.getJSONObject(i);
String cityName =
jsonObject.optString("cityName").toString();
String weather =
jsonObject.optString("weather").toString();
String temperature=jsonObject.optString("temperature").toString();
String icon =
jsonObject.optString("icon").toString();
weatherArray.add(new Weather(cityName,
weather, temperature, icon));
}
myAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
//...
}
2.