json trong java, làm việc với json trong java, sử dụng json

Chúng ta đã cùng tìm hiểu về JSON bài trước.

Trong bài số này, tôi sẽ hướng dẫn bạn thao tác với JSON trong ngôn ngữ lập trình Java, bài này gồm 2 phần:
  1. Mô tả đối tượng bằng JSON.
  2. Phân tích chuỗi JSON (JSON String) thành đối tượng.
Hiện nay có rất nhiều thư viện hỗ trợ chúng ta làm việc với JSON trên Java, như Json.simple, Gson,... Dưới dây là bảng so sánh hiệu năng của một số thư viện tiêu biểu:


Trong bài này tôi sử dụng thư viện Json.simple, vì cũng như cái tên của nó, sử dụng Json.simple rất đơn giản và hiệu năng cũng không hề tồi.

Chuẩn bị đồ nghề bắt tay vào viết code:


I. Mô tả đối tượng bằng JSON

Gồm 2 phần con:
  • Mô tả đối tượng
  • Mô tả một tập đối tượng (List)

1) Mô tả đối tượng

Vấn đề đặt ra: Tôi có một đối tượng Student, với các thuộc tính: id, name, email. Hãy mô tả đối tượng này bằng JSON.

Trước tiên hãy xem kết quả sau khi một đối tượng Student được mô tả bằng JSON:
{
    "id": "1",
    "name": "Duy hung",
    "email": "duyhung.ws@gmail.com"
}

Tip: Để kiểm tra chuỗi JSON có đúng cú pháp hay không, bạn vào trang http://jsonlint.com/

Chúng ta cùng viết code Java để sinh ra được đoạn JSON như trên.

Lưu ý: Sau khi tạo Project, bạn cần add thêm thư viện JSON.simple vừa tải về vào Project.

+ Đối tượng Student.
Đối tượng của chúng ta cần implements inteface JSONAware@Override lại phương thức toJSONString(). Khi đó, JSON.simple sẽ dùng phương thức này để tạo ra chuỗi JSON mô tả đối tượng.
package com.blogspot.code4lifevn.json;

import org.json.simple.JSONAware;

public class Student implements JSONAware {

    private int id;
    private String name;
    private String email;

    public Student() {

    }

    public Student(int id, String name, String email) {
        super();
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Các phương thức get và set ...

    // Phần quan trọng nhất: toJSONString()
    @Override
    public String toJSONString() {

        StringBuffer sb = new StringBuffer();

        sb.append("{"); // Bắt đầu một đối tượng JSON là dấu mở ngoặc nhọn

        sb.append("\"id\":\"" + getId() + "\""); // dòng này có nghĩa là
                                                    // "id":"Giá_Trị"
        sb.append(","); // sau mỗi cặp key/value là một dấu phẩy

        sb.append("\"name\":\"" + getName() + "\"");
        sb.append(",");

        sb.append("\"email\":\"" + getEmail() + "\"");

        sb.append("}"); // Kết thúc một đối tượng JSON là dấu đóng ngoặc nhọn
         
        return sb.toString();

    }

}


+ Tạo chuỗi JSON
Rất đơn giản, chúng ta chỉ cần gọi phương thức toJSONString là có kết quả như ý:
package com.blogspot.code4lifevn.json;

public class Main {
    public static void main(String[] args){
  
        Student student = new Student(1, "Duy hung", "duyhung.ws@gmail.com");

        String JSONResult = student.toJSONString();

        System.out.println(JSONResult);
  
    }
}

Kết quả in ra trên Console:

Bạn nên copy ngay và luôn vào http://jsonlint.com để xem đã chuẩn cú pháp hay chưa, thừa hoặc hiểu một dấu phẩy là hỏng luôn.

2. Mô tả một tập đối tượng (List)

Vấn đề mô tả một đối tượng đã được giải quyết, vậy câu hỏi đặt ra là, tôi muốn mô tả một tập các đối tượng thì sao? 

Câu trả lời đơn giản không kém phần trên, chúng ta sử dụng JSONArray để tạo ra chuỗi JSON từ một List, bạn xem code hiểu ngay:

package com.blogspot.code4lifevn.json;

public class Main {
    public static void main(String[] args){
  
        // Khởi tạo list với 3 đối tượng Student
        List<Student> list = new ArrayList<Student>() {
            {
                add(new Student(1, "Duy hung", "duyhung.ws@gmail.com"));
                add(new Student(2, "Do manh", "code4lifevn@gmail.com"));
                add(new Student(3, "Thai trung", "trungvt@gmail.com"));
            }
        };

        // Sử dụng JSONArray
        String JSONResult = JSONArray.toJSONString(list);

        System.out.println(JSONResult);  

    }
}

Kết quả:
Format cho dễ nhìn:
[
    {
        "id": "1",
        "name": "Duy hung",
        "email": "duyhung.ws@gmail.com"
    },
    {
        "id": "2",
        "name": "Do manh",
        "email": "code4lifevn@gmail.com"
    },
    {
        "id": "3",
        "name": "Thai trung",
        "email": "trungvt@gmail.com"
    }
]

II. Phân tích chuỗi JSON thành đối tượng

Trong phần này, chúng ta sẽ làm công việc ngược lại ở trên, đó là từ một chuỗi JSON (JSON String), chúng ta phân tích ra thành các đối tượng, cụ thể trong bài này là phân tích về đối tượng Student hoặc một List.

Gồm 2 phần con:
  • Phân tích đối tượng
  • Phân tích một tập đối tượng (List)

1. Phân tích đối tượng

Đầu tiên, để phân tích một chuỗi JSON thì chúng ta cần biết là chuỗi đấy có những cái gì. Xem lại chuỗi JSON mô tả đối tượng Student:
{
    "id": "1",
    "name": "Duy hung",
    "email": "duyhung.ws@gmail.com"
}
Chúng ta thấy, ở đây có 3 từ khóa (Key): id, name, email và 3 giá trị (Value) tương ứng. Công việc của ta là lấy ra 3 giá trị trên để gán vào đối tượng Student.

Cách làm gồm 3 bước:
  1. Tạo đối tượng JSONParser
  2. Parser chuỗi JSON về một JSONObject
  3. Lấy các giá trị trong jsonObject thông qua các Key
package com.blogspot.code4lifevn.json;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Main {
    public static void main(String[] args) {
  
        // Chuỗi JSON mẫu mô tả một đối tượng Student
        String jsonString = "{\"id\": \"1\", \"name\": \"Duy hung\", \"email\": \"duyhung.ws@gmail.com\"}";

        // Phân tích
        try {

            // 1. Tạo ra một JSONParser
            JSONParser jsonParser = new JSONParser();

            // 2. Parser chuỗi JSON về một JSONObject
            JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonString);

            // 3. Lấy các giá trị trong jsonObject thông qua các Key
            int id = Integer.parseInt((String) jsonObject.get("id"));
            String name = (String) jsonObject.get("name");
            String email = (String) jsonObject.get("email");

            Student student = new Student(id, name, email);

            System.out.println("ID    : " + student.getId());
            System.out.println("Name  : " + student.getName());
            System.out.println("Email : " + student.getEmail());

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

Kết quả:

2. Phân tích một tập đối tượng

Ở trên chúng ta đã biết cách phân tích một chuỗi JSON về một Object, còn đối với việc một List<Object> thì làm thế nào?
Cũng với 3 bước trên: Tạo JSONParser, parse, lấy giá trị, tuy nhiên có khác một chút ở bước 2, thay vì lấy JSONObject, chúng ta sẽ lấy về JSONArray.

Chúng ta sẽ dùng lại chuỗi JSON này,
[
    {
        "id": "1",
        "name": "Duy hung",
        "email": "duyhung.ws@gmail.com"
    },
    {
        "id": "2",
        "name": "Do manh",
        "email": "code4lifevn@gmail.com"
    },
    {
        "id": "3",
        "name": "Thai trung",
        "email": "trungvt@gmail.com"
    }
]

Mã xử lý chính:
package com.blogspot.code4lifevn.json;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Main {
    public static void main(String[] args) {
  
        // Chuỗi JSON mẫu mô tả một danh sách các đối tượng Student
        String jsonString = "[{\"id\": \"1\", \"name\": \"Duy hung\", \"email\": \"duyhung.ws@gmail.com\"}, {\"id\": \"2\", \"name\": \"Do manh\", \"email\": \"code4lifevn@gmail.com\"}, {\"id\": \"3\", \"name\": \"Thai trung\", \"email\": \"trungvt@gmail.com\"} ]";

        // Phân tích
        try {

            // 1. Tạo ra một JSONParser
            JSONParser jsonParser = new JSONParser();

            // 2. Parser chuỗi JSON về một JSONArray
            JSONArray jsonArray = (JSONArray) jsonParser.parse(jsonString);

            // 3. Lấy các giá trị trong jsonArray bằng cách lặp qa từng phần tử
            for (int i = 0; i < jsonArray.size(); i++) {

                // Mỗi phần tử của JSONArray lại là một JSONObject
                JSONObject jsonObject = (JSONObject) jsonArray.get(i);

                int id = Integer.parseInt((String) jsonObject.get("id"));
                String name = (String) jsonObject.get("name");
                String email = (String) jsonObject.get("email");

                // Gán vào đối tượng và in ra màn hình
                Student student = new Student(id, name, email);
                System.out.println("ID    : " + student.getId());
                System.out.println("Name  : " + student.getName());
                System.out.println("Email : " + student.getEmail());
                System.out.println();
            }

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

Kết quả:


Như vậy là tôi đã hoàn thành xong bài hướng dẫn làm việc với JSON trên Java, nếu có bất kỳ thắc mắc hoặc góp ý, bạn vui lòng comment lại, tôi sẽ trả lời sớm nhất có thể.

Và Tip cuối cùng là thay vì chỉ đọc code và chạy demo, hãy xắn tay áo lên và code thì sẽ hiệu quả hơn rất nhiều đấy.



Xem thêm bài viết: http://code4lifevn.blogspot.com/2013/08/json-la-gi.html
 
Download Source Code


9 nhận xét:

  1. Hi anh Hùng,
    JSON đọc là gì nhỉ :)
    "di son" à hay "jay s âu en"

    Trả lờiXóa
  2. Hi.
    Mình hay đọc là "Giây Sơn", một số đọc là 'Di sơn', 'Di săn', 'Dây sừn',.. cũng mối người một kiểu phát âm :D Làm sao nói để ng khác hiểu là được rồi :D

    Trả lờiXóa
  3. bạn xử lý mình mảng này đc ko?
    {
    "name": "Tien Bin",
    "location": {
    "id": "106388046062960",
    "name": "Hanoi, Vietnam"
    },
    "id": "656912701"
    },
    {
    "name": "Ha Ta",
    "location": {
    "id": "106388046062960",
    "name": "Hanoi, Vietnam"
    },
    "id": "754924750"
    },

    Trả lờiXóa
  4. Dùng json để lấy dữ liệu từ file txt thì mình làm như thế nào,chỉ mình với !

    Trả lờiXóa
  5. khi tôi in ra 1 list ra thì kết quả không được như vậy, kể cả khi tạo 1 list fixed cũng không được, bạn làm ơn kiểm tra hộ mình nhé. Tks!

    Trả lờiXóa
  6. Bạn nói rõ xem bạn gặp lỗi như nào mình mới giúp được nhé.

    Trả lờiXóa
  7. Bạn đọc file text ra String rồi parse từ String ra JSON như các ví dụ trên là được nhé.

    Trả lờiXóa
  8. Ban cho minh hoi lỗi này là lỗi gì vậy?

    Trả lờiXóa
  9. Error: Could not find or load main class json.JSON
    Java Result: 1

    Trả lờiXóa

 

code4lifevn team

Thanh niên nghiêm túc :)

Name: Manh Do

Age: years old

Job: Senior Java and Mobile Developer

Country: VietNam

Name: Hung Nguyen

Age: years old

Job: Android Developer

Country: VietNam

Name: Trung PH

Age: years old

Job: Senior iOS and Android Developer

Country: VietNam

Name: Điệp NT

Age: years old

Job: Senior .Net and Android Developer

Country: VietNam