12/08/2018, 13:26

Tìm hiểu về Android JSON Parser

JSON là viết tắt của JavaScript Object Notation. Nó là một định dạng trao đổi dữ liệu độc lập và là giải pháp thay thế tốt nhất cho XML. Bài viết này sẽ tìm hiểu một cách cơ bản nhất làm thế nào để phân tích các tập tin JSON và trích xuất thông tin cần thiết từ nó. Android cung cấp bốn lớp khác ...

JSON là viết tắt của JavaScript Object Notation. Nó là một định dạng trao đổi dữ liệu độc lập và là giải pháp thay thế tốt nhất cho XML. Bài viết này sẽ tìm hiểu một cách cơ bản nhất làm thế nào để phân tích các tập tin JSON và trích xuất thông tin cần thiết từ nó.

Android cung cấp bốn lớp khác nhau để thao tác dữ liệu JSON. Đó là các lớp: JSONArray, JSONObject, JSONStringer và JSONTokenizer.

Bước đầu tiên, cần xác định các trường(fields) trong dữ liệu JSON mà ta đang quan tâm. Ví dụ. Trong JSON đưa ra dưới đây, có rất nhiều trường dữ liệu, nhưng ta chỉ cần quan tâm đến trường "temp" để lấy được nhiệt độ.

{
    "sys":
        {
            "country": "GB",
            "sunrise": 1381107633,
            "sunset": 1381149604
        },
    "weather":[
        {
            "id": 711,
            "main": "Smoke",
            "description": "smoke",
            "icon": "50n"
        }
    ],
    "main":
        {
            "temp": 304.15,
            "pressure": 1009,
        }
}

JSON - Elements

Một tập tin JSON bao gồm nhiều thành phần. Dưới đây là các thành phần của một tập tin JSON và mô tả:

  • Array([) : Trong một tập tin JSON, khung vuông ([) đại diện cho một mảng JSON.
  • Objects({) : Trong một tập tin JSON, khung nhọn ({) đại diện cho một đối tượng JSON.
  • Key : Một đối tượng JSON chứa một key mà nó chỉ là một chuỗi string. Cặp key/value tạo nên một đối tượng JSON.
  • Value : Mỗi key có một giá trị mà có thể là chuỗi, số nguyên, ...

JSON - Parsing

Đối với việc phân tích một đối tượng JSON, chúng ta sẽ tạo ra một đối tượng của lớp JSONObject và xác định một chuỗi có chứa dữ liệu JSON với nó. Cú pháp của nó là:

    String in;
    JSONObject reader = new JSONObject(in);

Bước cuối cùng là phân tích chuỗi JSON. Một tập tin JSON bao gồm nhiều đối tượng khác nhau với các cặp key/value. Vì vậy JSONObject có một chức năng riêng biệt để phân tích từng thành phần của tập tin JSON. Cú pháp của nó:

    JSONObject sys = reader. getJSONObject("sys");
    country = sys. getString("country");
    JSONObject main = reader. getJSONObject("main");
    temperature = main. getString("temp");

Phương thức getJSONObject() trả về đối tượng JSON. Phương thức getString() trả về chuỗi giá trị của key tương ứng.

Ngoài các phương thức này, có những phương thức khác được cung cấp bởi lớp này cho phép phân thích các tập tin JSON tốt hơn. Sau đây là một số phương thức khác:

  • get(String name) : Phương thức trả về giá trị kiểu Object.
  • getBoolean(String name) : Phương thức trả về giá trị kiểu Boolean.
  • getDouble(String name) : Phương thức trả về giá trị kiểu Double.
  • getInt(String name) : Phương thức trả về giá trị kiểu Integer.
  • getLong(String name) : Phương thức trả về giá trị kiểu Long.
  • length() : Phương thức trả về số lượng cặp giá trị key/value trong đối tượng.
  • names() : Phương thức trả về một mảng chứa tên chuỗi trong đối tượng này.

Ứng dụng

Sau đây ta sẽ sử dụng những phần được nói ở trên để xây dựng một ứng dụng phân tích một chuỗi JSON được trả về từ một API: "http://ip-api.com/json"

Api trên trả về cho ta các thông tin về Ip Geolocation, cụ thể là:

{
    "status": "success",
    "country": "COUNTRY",
    "countryCode": "COUNTRY CODE",
    "region": "REGION CODE",
    "regionName": "REGION NAME",
    "city": "CITY",
    "zip": "ZIP CODE",
    "lat": LATITUDE,
    "lon": LONGITUDE,
    "timezone": "TIME ZONE",
    "isp": "ISP NAME",
    "org": "ORGANIZATION NAME",
    "as": "AS NUMBER / NAME",
    "query": "IP ADDRESS USED FOR QUERY"
}

Ở đây, ta chỉ quan tâm đến 6 trường là: country, regionName, lat, lon, isp, query.

Đầu tiên ta sẽ xây dựng một đối tượng tương ứng chứa những thông tin ta cần lấy.

    private String country = "country";
    private String regionName = "regionName";
    private String providers = "isp";
    private String latitude = "lat";
    private String longitude = "lon";
    private String publicIPAddress = "query";
    private String urlApi = "http://ip-api.com/json";
    public volatile boolean parsingComplete = true;

    public MyHandle(){
    }

    public String getCountry() {
        return country;
    }

    public String getRegionName() {
        return regionName;
    }

    public String getLatitude() {
        return latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public String getProviders() {
        return providers;
    }

    public String getPublicIPAddress() {
        return publicIPAddress;
    }

Tiếp theo là phần quan trọng nhất, lấy chuỗi JSON từ Api.

    Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    URL url = new URL(urlApi);
                    HttpURLConnection conn = (HttpURLConnection)
                    url.openConnection();
                    conn.setReadTimeout(30000 /* milliseconds */);
                    conn.setConnectTimeout(30000 /* milliseconds */);
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);
                    // Starts the query
                    conn. connect();
                    InputStream stream = conn.getInputStream();
                    String data = convertStreamToString(stream);
                    readAndParseJSON(data);
                    stream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    });

Có data rồi parser thôi.

    static String convertStreamToString(java.io.InputStream is) {
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("A");
        return s.hasNext() ? s.next() : "";
    }

    public void readAndParseJSON(String in) {
        try {
            JSONObject reader = new JSONObject(in);
            Log.d("MyHandle", reader.toString());
            country = reader.getString(country);
            regionName = reader.getString(regionName);
            latitude = reader.getString(latitude);
            longitude = reader.getString(longitude);
            providers = reader.getString(providers);
            publicIPAddress = reader.getString(publicIPAddress);
            parsingComplete = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Như vậy là ta đã lấy được các thông tin cần thiết từ chuỗi JSON trả về từ Api gọi đến.

1.png

2.png

Github: https://github.com/GreatHoang/JSONParserDemo

0