Parse Json trong Android- Đây là cách làm không thể dễ hơn!

0
28

parse-json-in-android

JSON 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 giữ liệu giữa Server và Client người ta thường ưu thích sử dụng JSON. 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ào sẽ là parse JSON để hiển thị ra màn hình.

Không biết các bạn thế nào, chứ ngày trước mình rất ngại parse JSON trong 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ó thì 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 và deserialise Java object sang JSON và ngược lại. Có thể các bạn không tin vào sức mạng 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 bằng 2 cách: sử dụng API của Android như cách truyền thống và 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 và 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.

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

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

Chúng ta vẫn sử dụng file json ở trên nhé. Để có thể sử dụng được thư viện gson, chúng ta phải thêm khai báo trong grade file như bên dưới

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 để parse JSON 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.

BÌNH LUẬN

Please enter your comment!
Please enter your name here