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
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);
        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;
        }
    }
}
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:
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.