[Android căn bản] Bài 13: Xử lý Json trong Android

[Android căn bản] Bài 13: Xử lý Json trong Android

Chào các bạn chúng ta lại gặp nhau trong series Android truyền kì. Ở kì trước tôi đã giới thiệu với các bạn về cách lưu trữ dữ liệu trong Android hôm nay tôi xin giới thiệu với các bạn cách xử lý Json trong Android.

Trong thực tế hiện nay thì nhu cầu giao tiếp giữa các dịch vụ web và mobile càng ngày càng trở nên quan trong và và hiện nay các ứng dụng di động đã trở một phần không thể thiếu của web như các bạn thấy các trang báo mạng hiện nay đều ra mắt ứng dụng đọc báo trên điện thoại đúng không nào nó giúp cập nhật những tin tức mới nhất và nhanh nhất đến người đọc hay như các ứng dụng trợ giúp đầu tư chứng khoán như bạn thấy đấy chỉ cần chậm một giây thôi thì sẽ lỡ mất cơ hội trên thị trường chứng khoán. Vậy các website giao tiếp với ứng dụng di động như thế nào cho rẻ và tiết kiệm nhất. Rất đơn giản các website đó sẽ triển khai dịch vụ webservice để giao tiếp với mobile.

Webservice là gì?

Webservice là thành phần ứng dụng dùng để chuyển đổi một ứng dụng thông thường sang một ứng dụng web. Đồng thời nó cũng xuất bản các chức năng của mình để mọi người dùng internet trên thế giới đều có thể sử dụng thông qua nền tảng web thông qua các API được công bố ra cộng đồng.

Webservice có thể tạo ra bằng rất nhiều ngôn ngữ như PHP, ASP.Net, Java…. và nó thường trả về hai định dạng phổ biến là Json và XML nhưng thông thường thì sẽ là Json vì nó nhẹ và ít phức tạp hơn so với XML.

Json là gì?

JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu dữ liệu (data exchange format). Nó lưu trữ các dữ liệu theo cặp khóa và giá trị. So với XML thì JSON đơn giản về dễ đọc hơn. Nó đượ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 nhưng nhiều quá cũng rối mắt lắm và lắm cấu trúc trả về xem xong chỉ thốt lên một câu WTF.

Ví dụ về Json:
[ { color: "red", value: "#f00" }, { color: "green", value: "#0f0" }, { color: "blue", value: "#00f" }, { color: "cyan", value: "#0ff" }, { color: "magenta", value: "#f0f" }, { color: "yellow", value: "#ff0" }, { color: "black", value: "#000" }]

Như bạn thấy ở trên nó là một đoạn Json được trả về từ webservice nó gồm:

  • []: Mảng.
  • {}: Giá trị
  • Key:Value

Với những Json phước tạp bạn có thể vào trang này: http://jsonviewer.stack.hu/ để dễ dàng xem cấu trúc của nó.

Xử lý json trong Android.

Để xử lý Json trong Android ta sẽ sử dụng Gson hoặc Jackson cho nhanh thực ra Android nó đã hỗ trợ thư viện mặc định cho vấn đề này rồi nhưng cách sử dụng quá phức tạp nên tôi dùng Gson luôn cho nhanh.

Đầu tiên ta sẽ Xây dựng màn hình ứng dụng.

Giao diện ứng dụng

Giao diện ứng dụng

Màn hình chẳng có gì phức tạp cả nhể trống trơn chỉ có cái Layout =))

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    android:orientation="vertical"
    tools:context="com.chamcong.akinosora.json.MainActivity">



</LinearLayout>

Xong tiếp theo ta sẽ tạo đối tượng Java lưu ý tên các thuộc tính của đối tượng phải giống với các key trong Json.

Code:
package com.chamcong.akinosora.json;

/**
 * Created by Akinosora on 30/10/2017.
 */

public class ColorObject {
    private String color, value;

    public ColorObject(String color, String value) {
        this.color = color;
        this.value = value;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

Đó một đối tượng đơn giản giờ ta sẽ tạo một tiện ích đề lấy dữ liệu Json từ trên webservice về tạo file Commons

Code:
package com.chamcong.akinosora.json;

import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

/**
 * Created by Akinosora on 30/10/2017.
 */

public class Commons {
    private static final String TAG = Commons.class.getSimpleName();
    public Commons() {
    }

    /***
     * Hàm lấy dữ liệu Json từ webservice
     * @param sUrl
     * @return
     */
    public String getJSONStringFromURL(String sUrl) {
        String response = null;
        try {
            URL url = new URL(sUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();// Khởi tạo đối tượng HttpURLConnection
            conn.setRequestMethod("GET");// Phương thức lấy dữ liệu
            InputStream in = new BufferedInputStream(conn.getInputStream());// Tạo luồng đọc dữ liệu
            response = convertStreamToString(in);// Chuyển đổi dữ liệu thu được
        } catch (MalformedURLException e) {
            Log.e(TAG, "MalformedURLException: " + e.getMessage());
        } catch (ProtocolException e) {
            Log.e(TAG, "ProtocolException: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "IOException: " + e.getMessage());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
        return response;
    }

    /***
     * Chuyển đổi dữ liệu thành chuỗi khi đã lấy về
     * @param is
     * @return
     */
    private String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));// Tạo bộ đệm để đọc dòng dữ liệu
        StringBuilder sb = new StringBuilder();// Đối tượng xây dựng chuỗi từ những dữ liệu đã được đọc

        String line;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append('\n');// đọc và thêm các dữ liệu đã đọc được từ luồng vào chuỗi.
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

Đó xong phần lấy dữ liệu và chuyển đổi dữ liệu giờ phần chính nào code file MainActivity thôi

Code:
package com.chamcong.akinosora.json;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private LinearLayout conrtainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        conrtainer = findViewById(R.id.container);
        new ColorAsync(this).execute("http://cdn.crunchify.com/wp-content/uploads/code/jsonArray.txt");
    }

    class ColorAsync extends AsyncTask<String, ColorObject, ColorObject> {
        private Activity mActivity;
        final RelativeLayout.LayoutParams params =
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);

        public ColorAsync(Activity mActivity) {
            this.mActivity = mActivity;
        }

        @Override
        protected ColorObject doInBackground(String... strings) {
            String UrlWebservice = strings[0];// lấy địa chỉ Webservice được truyền vào
            String JsonString = new Commons().getJSONStringFromURL(UrlWebservice);
            ArrayList<ColorObject> colorObjectArrayList = new Gson().fromJson(JsonString, new TypeToken<ArrayList<ColorObject>>() {
            }.getType()); // Chuyển đổi chuỗi Json thành dữ liệu trong Java bằng thư viện Gson Java thế nào Android thế vậy =))

            for (int i = 0 ; i< colorObjectArrayList.size(); i++) {
                SystemClock.sleep(400);// Nghỉ 400ms rồi chơi thiếp
                publishProgress(colorObjectArrayList.get(i));

            }

            return null;
        }

        @Override
        protected void onProgressUpdate(ColorObject... values) {
            super.onProgressUpdate(values);

            TextView label = new TextView(mActivity);// Taọ một cái Textview nà
            label.setText(values[0].getColor());
            label.setBackground(new ColorDrawable(Color.parseColor(values[0].getColor())));
            label.setLayoutParams(params);// Set các tham số chiều rọng, cao cho Textview nà.
            conrtainer.addView(label);// Thêm Textview vào container nè
        }
    }
}

Rồi xong MainActivity giờ xin phép mẹ đi chơi Net nào(Mà thôi xin làm gì ăn vụng nó nới khoái).

Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.chamcong.akinosora.json">

    <uses-permission android:name="android.permission.INTERNET" />// Xin phép mẹ
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Và đây là kết quả:

Kết quả chạy ứng dụng Json

Kết quả chạy ứng dụng Json

Pew xong tôi đã hướng dẫn các bạn cách sử lý Json trong Android giờ bạn có thể áp dụng nó vô viết một cái app chia sẻ ảnh của thánh nữ Maria…. Ozawa rồi đấy =)).

Vậy à bài hôm nay đã xong cảm ơn các bạn đã theo dõi và xin hẹn gặp lại các bạn ở chương cuối trong bí kíp Android truyền kì xin chào và hẹn gặp lại.