Hướng dẫn dùng jsonlinr JavaScript

1. JSON là gì?

JSON là định dạng trao đổi dữ liệu độc lập, tương tự như XML

JSON được hỗ trợ trực tiếp trong Javascript

JSON chỉ cho phép lưu trữ dữ liệu dưới dạng chữ và số

Cấu trúc của JSON dựa trên các cặp Key/Value

Key là một chuỗi

Value có thể là chuỗi số, giá trị boolean hoặc object

Một JSON Object bao gồm các cặp Key/Value và được bắt đầu bởi dấu “{” và kết thúc bởi dấu “}

Một mảng các giá trị được nằm trong cặp dấu ngoặc vuông [ ] và cách nhau bởi dấu phẩy “,

2. Sử dụng JSON:

Ví dụ 1: Sử dụng JSON để mô tả đối tượng Book có 3 thuộc tính bookId, title, price

   1:  {
   2:      "bookId" : 1,
   3:      "title" : "JSON Tutorial",
   4:      "price" : 40
   5:  }

 Ví dụ 2: Sử dụng JSON để mô tả một danh sách các đối tượng Book

   1:  [
   2:      {
   3:          "bookId" : 1,
   4:          "title" : "JSON Tutorial",
   5:          "price" : 40
   6:      },
   7:     
   8:      {
   9:           "bookId" : 2,
  10:          "title" : "Learn Java By Examples",
  11:          "price" : 60
  12:      }
  13:  ]

Để kiểm tra chuỗi JSON có chính xác hay không, có thể vào trang: http://jsonlint.com/ để kiểm tra.

Tất nhiên là chúng ta không phải tự tay viết ra những dòng này, sẽ có thư viện hỗ trợ.

Các kiểu dữ liệu của JSON:

– Có 5 kiểu dữ liệu chính:

  • Number: kiểu số bao gồm số nguyên và số thực
  • String: kiểu chuỗi, nội dung bao bởi cặp dấu nháy kép , những ký tự đặt biệt được escape bởi dấu \.Theo chuẩn JSON thì không sử dụng dấu nháy đơn như Javascript để bọc chuỗi.
  • Boolean: kiểu luận lý bao gồm 2 giá trị là truefalse
  • Array: kiểu mảng, gồm các phần tử phân cách nhau bởi dấu phẩy ‘,’ và mảng được bao bởi cặp dấu []
  • Object: kiểu đối tượng, gồm những cặp giá trị đi cùng nhau, mỗi cặp phân cách bởi dấu phẩy’,’, đối tượng được bao bởi cặp dấu {}, cặp giá trị bao gồm tên và giá trị được phân cách bởi dấu hai chấm’:
  • Null: giá trị null

– Kiểu DateTime: Do JSON là một chuẩn chung có nghĩa là không phụ thuộc nền tảng hay công nghệ, vì vậy JSON không định ra một kiểu thời gian cụ thể, do mỗi ngôn ngữ lập trình, mỗi nền tảng triển khai có sự quy định về kiễu dữ liệu ngày tháng khác nhau, đơn cử như Javascript lưu trữ kiểu Date chỉ từ 1-1-1970 trở đi hoặc như PHP thì không có kiểu dữ liệu Date, Date chỉ là một con số chỉ ra số millisecond tính từ 1-1-1970 (với phiên bản 5.1.0 thì từ 13-12-1901), còn .NET thì có giới hạn ngày gần như rộng nhất. Chính vì không thể quy định được nên cách gửi / nhận kiểu dữ liệu ngày tháng (Date) bằng JSON cũng khác nhau.

3. Sử dụng JSON với Java

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: Json.simple, org.json, …

Bảng dưới đây so sánh hiệu năng của một số thư viện tiêu biểu

Hướng dẫn dùng jsonlinr JavaScript

Trong phần này, tôi sẽ sử dụng thư viện JSON.simple để minh họa. Các bạn có thể download thư viện JSON.simple tại đây.

Các ví dụ minh họa sẽ được viết bằng Netbean IDE 7.3.1. Nói chung thì code minh họa cũng tương tự trên các IDE khác.

Sau khi tạo project, các bạn phải thêm thư viện JSON.simple đã download ở trên vào project.

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

– Mô tả đối tượng

– Mô tả danh sách đối tượng

3.1.1. Mô tả đối tượng

Hãy mô tả đối tượng Book, với các thuộc tính: bookId, title, price bằng JSON

   1:  {
   2:      "bookId" : "1",
   3:      "title" : "JSON Tutorial"
   4:      "price" : "40"
   5:  }
 

Chúng ta sẽ viết mã Java để tạo ra đoạn mã JSON cho đối tượng Book ở trên.

– Đối tượng Book

+ Đối tượng Book cần phải implements interface JSONAware

+ Override lên phương thức toJSONString() => JSON.simple dùng phương thức này để tạo ra chuỗi JSON mô tả đối tượng

   1:  package com.code5s.json;

   2:   
   3:  import org.json.simple.JSONAware;
   4:   
   5:  /**
   6:   *
   7:   * @author Quang
   8:   */
   9:  public class Book implements JSONAware
  10:  {
  11:      private int bookId;
  12:      private String title;
  13:      private int price;
  14:      public Book(){}
  15:      public Book(int bookId, String title, int price)
  16:      {
  17:          this.bookId = bookId;
  18:          this.title = title;
  19:          this.price = price;
  20:      }
  21:      
  22:      @Override
  23:      public String toJSONString() {
  24:          StringBuilder sb = new StringBuilder(); 
  25:          sb.append("{"); // Bắt đầu một đối tượng JSON là dấu mở ngoặc nhọn 
  26:          sb.append("\"bookId\"").append(":").append("\"").append(bookId).append("\""); 
  27:                      // dòng này có nghĩa là: "id":"Giá_Trị"
  28:          sb.append(","); // sau mỗi cặp key/value là một dấu phẩy 
  29:          sb.append("\"name\":\"").append(title).append("\"");
  30:          sb.append(","); 
  31:          sb.append("\"email\":\"").append(price).append("\""); 
  32:          sb.append("}"); // Kết thúc một đối tượng JSON là dấu đóng ngoặc nhọn          
  33:          return sb.toString();
  34:      }
  35:   
  36:      /**
  37:       * @return the bookId
  38:       */
  39:      public int getBookId() {
  40:          return bookId;
  41:      }
  42:   
  43:      /**
  44:       * @param bookId the bookId to set
  45:       */
  46:      public void setBookId(int bookId) {
  47:          this.bookId = bookId;
  48:      }
  49:   
  50:      /**
  51:       * @return the title
  52:       */
  53:      public String getTitle() {
  54:          return title;
  55:      }
  56:   
  57:      /**
  58:       * @param title the title to set
  59:       */
  60:      public void setTitle(String title) {
  61:          this.title = title;
  62:      }
  63:   
  64:      /**
  65:       * @return the price
  66:       */
  67:      public int getPrice() {
  68:          return price;
  69:      }
  70:   
  71:      /**
  72:       * @param price the price to set
  73:       */
  74:      public void setPrice(int price) {
  75:          this.price = price;
  76:      }
  77:      
  78:  }

– Tạo chuỗi JSON: chúng ta chỉ cần gọi phương thức toJSONString()

   1:  public static void main(String[] args) 
   2:  {
   3:          Book aBook = new Book(1, "JSON Tutorial", 40);
   4:          String bookJson = aBook.toJSONString();
   5:          System.out.print(bookJson);
   6:  }

3.1.2. Mô tả danh sách đối tượng Book

Để mô tả danh sách các đối tượng Book, chúng ta sử dụng JSONArray để tạo ra chuỗi JSON từ một danh sách

   1:  public static void main(String[] args) 
   2:  {
   3:          List list = new ArrayList()
   4:          {
   5:              {
   6:                  add(new Book(1, "JSON Tutorial", 40));
   7:                  add(new Book(2, "Learn Java By Examples", 60));
   8:              }
   9:          };
  10:          
  11:          String listBookJson = JSONArray.toJSONString(list);
  12:          System.out.println(listBookJson);
  13:   }

3.2. 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, tức là từ một chuỗi JSON, chúng ta phân tích ra thành các đối tượng

Phần này cũng bao gồm 2 phần con:

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

– Phân tích danh sách đối tượng

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

Để phân tích một chuỗi JSON, chúng ta cần phải biết chuỗi đó chứa những cái gì. Xem lại chuỗi JSON mô tả đối tượng Book

   1:  {
   2:      "bookId" : "1",
   3:       "title" : "JSON Tutorial",
   4:       "price" : "40"   
   5:  }

Chúng ta thấy trong chuỗi này có 3 key là: bookId, title, price và 3 value tương ứng. Công việc của chúng ta là đọc ra 3 giá trị trên và gán vào đối tượng Book

Các bước thực hiện

– Tạo đối tượng JSONParser

– Parser chuỗi JSON thành một JSONObject

– Lấy các giá trị trong jsonObject thông qua các key

   1:  public static void main(String[] args) 
   2:   {
   3:          // Chuỗi JSON mẫu mô tả một đối tượng Student
   4:          String jsonString = "{\"bookId\": \"1\", \"title\": \"JSON Tutorial\", \"price\": \"40\"}";
   5:          // Phân tích
   6:          try 
   7:          {
   8:               // 1. Tạo ra một JSONParser
   9:              JSONParser jsonParser = new JSONParser();
  10:               // 2. Parser chuỗi JSON về một JSONObject
  11:              JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonString);
  12:               // 3. Lấy các giá trị trong jsonObject thông qua các Key
  13:              int bookId = Integer.parseInt((String) jsonObject.get("bookId"));
  14:              String title = (String) jsonObject.get("title");
  15:              int price = Integer.parseInt((String) jsonObject.get("price"));
  16:   
  17:              Book aBook = new Book(bookId, title, price); 
  18:              System.out.println("BookID   : " + aBook.getBookId());
  19:              System.out.println("Title    : " + aBook.getTitle());
  20:              System.out.println("Price    : " + aBook.getPrice());
  21:   
  22:          } 
  23:          catch (Exception e) 
  24:          {
  25:              e.printStackTrace();
  26:          }
  27:   }

3.2.2. Phân tích danh sách đối tượng

Các bước cũng giống như trên, tuy nhiên trong bước 2, thay vì lấy về JSONObject, chúng ta sẽ lấy về JSONArray

   1:  public static void main(String[] args) 
   2:   {
   3:          // Chuỗi JSON mẫu mô tả một đối tượng Student
   4:          String jsonString = "[{\"bookId\": \"1\", \"title\": \"JSON Tutorial\", \"price\": \"40\"},"
   5:                  + "{\"bookId\": \"2\", \"title\": \"Learn Java By Examples\", \"price\": \"60\"}]";
   6:          // Phân tích
   7:          try 
   8:          {
   9:               // 1. Tạo ra một JSONParser
  10:              JSONParser jsonParser = new JSONParser();
  11:               // 2. Parser chuỗi JSON về một JSONObject
  12:              JSONArray jsonArray = (JSONArray) jsonParser.parse(jsonString);
  13:              // 3. Lấy các giá trị trong jsonArray bằng cách lặp qua từng phần tử
  14:              for (int i = 0; i < jsonArray.size(); i++)
  15:              {
  16:                 // Mỗi phần tử của JSONArray lại là một JSONObject
  17:                 JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  18:                 int bookId = Integer.parseInt((String) jsonObject.get("bookId"));
  19:                 String title = (String) jsonObject.get("title");
  20:                 int price = Integer.parseInt((String) jsonObject.get("price"));
  21:   
  22:                 Book aBook = new Book(bookId, title, price); 
  23:                 System.out.println("BookID   : " + aBook.getBookId());
  24:                 System.out.println("Title    : " + aBook.getTitle());
  25:                 System.out.println("Price    : " + aBook.getPrice());
  26:                  System.out.println();
  27:              }
  28:          } 
  29:          catch (Exception e) 
  30:          {
  31:              e.printStackTrace();
  32:          }
  33:   }