Xử lý JSON trong Android- Cách làm không thể dễ hơn

0
Dịch vụ dạy kèm gia sư lập trình

Bài viết này sẽ hướng dẫn các bạn cách Parse Json Android một cách dễ dàng nhất, ngắn gọn và hiệu quả.

Xử lý JSON Android và đôi lời giới thiệu

JSON là một chuẩn định dạng dữ liệu rất phổ biến ngày nay. Việc trao đổi dữ liệu giữa Server và Client người ta thường ưu thích sử dụng JSON.

Bạn có thể tìm hiểu thêm về JSON tại đây: JSON là gì?

Các ứng dụng có mô hình Client Server như ứng dụng đọc báo, ứng dụng chat, ứng dụng mạng xã hội… thì thường client sẽ request lên server và sau đó server sẽ trả dữ liệu cho client dưới dạng JSON. Nhiệm vụ của Client lúc này là parse JSON để hiển thị ra màn hình.

Xử lý JSON trong Android

Không biết các bạn thế nào, chứ ngày trước mình rất ngại Parse Json Android. Vì thấy nó cứ phức tạp thế nào ấy.

Cách làm mà các bạn hay được hướng dẫn sẽ là tạo ra 1 JSONOject hoặc JSONArray sau khi đọc json vào inputstream. Nhưng sau đó việc xử lý lại trở nên khó khăn vì chúng ta phải thực hiện thủ công mọi đối tượng trong mỗi mảng. Điều này có thể gây ra rất nhiều lỗi.

Cho đến một ngày mình biết đến thư viện GSON, và thử dùng nó, mình đã phải thốt lên rằng: Thần tiên đây rồi!

Đây là một thư viện nguồn mở của Google để serialise/deserialise Java object sang JSON và ngược lại.

Có thể các bạn không tin vào sức mạnh của thư viện gson. Mình sẽ chứng mình bằng cách thực hiện parse một file json theo 2 cách:

  • Sử dụng API của Android như cách truyền thống (À đừng quên đọc thêm sử dụng API với Kotlin nhé).
  • Sử dụng thư viện gson.

Nào cùng code và so sánh nhé!

Cách 1: Parse JSON sử dụng API thuần của Android

Đầu tiên, chúng ta tham khảo một file json mà mình tạo sẵn. Nhiệm vụ của chúng ta là sẽ đọc file này và parse nó rồi hiển thị ra màn hình.

{
  "events": [
    {
      "color": "#fdfdfd",
      "email": "[email protected]",
      "end_time": "2015-07-14T00:00:00",
      "id": 4,
      "latitude": 37.783839,
      "location_name": "Moscone centre",
      "logo": "http://mysecureshell.readthedocs.org/en/latest/_images/logo_redhat.png",
      "longitude": -122.400546,
      "name": "FOSSASIA",
      "slogan": "Fossasia",
      "start_time": "2015-05-28T13:00:00",
      "url": "www.google.com"
    }
  ]
}

Như bạn có thể thấy, ở đây có một đối tượng chứa một mảng các đối tượng sự kiện. Vì vậy, điều đầu tiên chúng ta sẽ làm là đọc file json kia và trả về String json bằng cách mở một inputstream đầu vào, sau đó đẩy nó vào buffer. Tiếp theo, chúng ta chuyển đổi mảng buffer thành một đối tượng String.

💖 Có thể bạn cần: Sử dụng Volley library Android để thao tác với Network API

String json = null;
try {
    InputStream inputStream = getAssets().open("events.json");
    int size = inputStream.available();
    byte[] buffer = new byte[size];
    inputStream.read(buffer);
    inputStream.close();
    json = new String(buffer, "UTF-8");

} catch (IOException e) {
    e.printStackTrace();
}

Bây giờ chúng ta có một String Json và có thể phân tích nó bằng cách kết hợp JSONObject và JSONArray. Trước tiên, chúng ta sẽ truy cập dữ liệu trong đối tượng json bên ngoài cùng, ở đây là “events”. Chúng ta làm như sau:

JSONObject jsonObject = new JSONObject(json);
JSONArray events = jsonObject.getJSONArray("events");

Bây giờ chúng ta có một mảng, chúng ta có thể duyệt qua nó để lấy các đối tượng bên trong mảng events.

for (int j=0; j < events.length(); j++){
    JSONObject cit = events.getJSONObject(j);
    String color = jsonObject.getString("color");
    String email = jsonObject.getString("email"); 
    String endTime = jsonObject.getString("end_time");
    String id = jsonObject.getString("id");
    String latitude = jsonObject.getString("latitude");
    String locationName = jsonObject.getString("location_name");
    String logo = jsonObject.getString("logo");
    String longitude = jsonObject.getString("longitude");
    String name = jsonObject.getString("name");
    String slogan = jsonObject.getString("slogan");
    String startTime = jsonObject.getString("start_time");
    String url = jsonObject.getString("url");
}

Như vậy là xong việc parse JSON theo cách truyền thống, cũng mất kha khá step đúng không.

Tiếp theo, chúng ta thử parse theo cách mới nhé, dùng thư viện gson

🔥 Đừng bỏ qua: Để trở thành lập trình quốc tế cần bao nhiêu thời gian

Cách 2: Parse Json Android sử dụng thư viện gson

Chúng ta vẫn sử dụng file json ở trên nhé. Để sử dụng thư viện gson, chúng ta thêm khai báo trong grade file:

compile 'com.google.code.gson: gson: 2.7'

Việc quan trọng nhất của việc parse JSON bằng gson là chúng ta phải định nghĩa một object có các thuộc tính tương đồng với Object json kia. Nhìn vào file json và sau đó chúng ta định nghĩa một class như sau:

public class Event {

    int id;
    String name;
    String email;
    String color;
    String logo;
    @SerializedName("start_time")
    String start;
    @SerializedName("end_time")
    String end;
    float latitude;
    float longitude;
    @SerializedName("location_name")
    String locationName;
    String url;
    String slogan;

    public Event(int id, String name, String email, String color, String logo, String start,
                 String end, float latitude, float longitude, String locationName, String url, String slogan) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.color = color;
        this.logo = logo;
        this.start = start;
        this.end = end;
        this.latitude = latitude;
        this.longitude = longitude;
        this.locationName = locationName;
        this.url = url;
        this.slogan = slogan;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getSlogan() {
        return slogan;
    }
    public void setSlogan(String slogan) {
        this.slogan = slogan;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLogo() {
        return logo;
    }
    public void setLogo(String logo) {
        this.logo = logo;
    }
    public String getStart() {
        return start;
    }
    public void setStart(String start) {
        this.start = start;
    }
    public String getEnd() {
        return end;
    }
    public void setEnd(String end) {
        this.end = end;
    }
    public float getLatitude() {
        return latitude;
    }
    public void setLatitude(float latitude) {
        this.latitude = latitude;
    }
    public float getLongitude() {
        return longitude;
    }
    public void setLongitude(float longitude) {
        this.longitude = longitude;
    }
    public String getLocationName() {
        return locationName;
    }
    public void setLocationName(String locationName) {
        this.locationName = locationName;
    }

}

Ở đây chúng ta đặt tên cho các tham số giống như trong json. Hoặc có thể thêm @SerializedName (entity_name). Sau đó, chúng ta gọi API của thư viện gson để thực sự truy xuất dữ liệu từ tệp json.

public class EventResponseList {
    @SerializedName("events")
    public List<Event> event;
}

Sau đó:

EventResponseList eventResponseList = gson.fromJson(json, EventResponseList.class);

Chỉ với 3 dòng lênh trên, chúng ta đã có một mảng các object được parse từ file json. Kết quả giống như cách 1 mà chúng đã làm. Từ mảng này, chúng ta có thể gọi và lấy giá trị của bất kì thuộc tính nào của file json kia. Quá dễ dàng phải không!?

Qua bài viết này, mình hi vọng cung cấp cho các bạn một cách thức mới để xử lý JSON trong Android hiệu quả và nhanh chóng. Các bạn thắc mắc chỗ nào thì comment bên dưới nhé, đừng quên like và chia sẻ nữa đấy.

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trước3 cách truyền dữ liệu giữa các Components trong Vue.js
Bài tiếp theoTìm hiểu Dagger 2 trong Android – Bắt đầu từ cơ bản
Sơn Dương
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Thông báo