Tài trợ bài viết này và giới thiệu dịch vụ, sản phẩm, thương hiệu, nhu cầu tuyển dụng của doanh nghiệp đến với cộng đồng.
STDIO JSON đóng góp vai trò quan trọng trong nhiều lĩnh vực cũng như lập trình game trong việc tăng hiệu suất của chương trình, giúp lập trình viên dễ dàng đọc và viết, dễ phân tích và phát sinh. Trong bài viết này tôi và các bạn sẽ cùng tìm hiểu những đặc điểm, cách xử lý và ứng dụng của file JSON trong Cocos2d-x 3.11.
Nội dung bài viết

Giới thiệu

Trong việc xây dựng, thiết kế project games của bạn, có nhiều tính toán, kỹ thuật, tính năng bạn phải sử dụng file để thao tác nhằm tăng hiệu suất của chương trình, giúp lập trình viên dễ dàng đọc và viết, dễ phân tích và phát sinh. Trong bài viết này tôi và các bạn sẽ cùng tìm hiểu những đặc điểm, cách xử lý và ứng dụng của file JSON trong Cocos2d-x 3.11.

Bài viết này tôi sử dụng framework RapidJSON, là framework mà Cocos2d-x 3.11 tích hợp.

Tiền đề bài viết

Trong thời gian học lập trình tại đây tôi được tham gia vào một Project thực thế do STDIO Training phát triển và làm việc với Cocos2d-x, Với sự giúp đỡ của các giảng viên, tôi học được nhiều điều không chỉ là kiến thức mà còn kinh nghiệm, đặc biệt trong lập trình games nói riêng và kiến thức phần mềm nói chung. Tôi luôn được khuyến khích chia sẻ các kiến thức mà mình học được, những kiến thức nhỏ nhặt nhất. 

Đối tượng hướng đến

Đây là bài viết mở đầu trong phần Thao Tác File Với Cocos2d-x 3.x.x. Bài viết này tôi hướng đến những người mới mới bắt đầu lập trình games 2D với Cocos2d-x 3.11 và chưa có những kiến thức liên quan.

JSON là gì?

JSON (viết tắt của JavaScript Object Noattion) là 1 định dạng dùng để lưu trữ dữ liệu có cấu trúc chặt chẽ, linh hoạt, dễ đọc hiểu và dễ viết, dễ chỉnh sửa cho lập trình viên. JSON được tạo ra dựa trên cấu trúc của ngôn ngữ lập trình Javascript.

Cách thể hiện trong file JSON

Các file JSON có định dạng mở rộng là .json.

Dưới đây là một cách thể hiện đơn giản của JSON, phần bên trái là tên của các key, phần bên phải là giá trị của nó.

{
    "hello": "STDIO",
    "t": true ,
    "f": false,
    "n": null,
    "i": 123,
    "pi": 3.1416,
    "array": [1, 2, 3, 4],
	"keys": {
		"string": "JSON 1",
		"i": 9,
	}
}

Để dễ hình dung hơn thì ta có được một sơ đồ như sau:

Final_fix(1)

Khai báo thư viện JSON

Để có thể sử dụng các hàm của JSON thì ta cần khai báo thư viện của nó trước như sau:

#include "rapidjson/rapidjson.h"
#include "rapidjson/document.h"

using namespace rapidjson;

Cách đọc dữ liệu từ JSON vào chương trình

Lúc này ta khởi tạo biến m_document để nhận dữ liệu của file JSON

Document m_document;
ssize_t size;

char* buf = (char*)FileUtils::getInstance()->getFileData(_fileName, "r", &size);
string content(buf, size);

m_document.Parse(content.c_str());

Phân tích:

  • Dòng 1: Sử dụng class Document mà rapidjson đã cung cấp
  • Dòng 2: Khởi tạo size để lưu trữ kích thước dữ liệu
  • Dòng 4: Lấy dữ liệu từ file JSON, _fileName lưu trữ tên file 
    (đây là hàm mà Cocos2d-x cung cấp sẵn, bạn có thể viết lại hàm này bằng cách đọc tập tin nhị phân để lấy dữ liệu và kích thước)
  • Dòng 5: Sử dụng Construct để tạo chuỗi có kích thước chính xác với dữ liệu
  • Dòng 7:Sử dụng hàm Parse để lưu thông tin vào Document

Sau bước này ta có m_document với đầy đủ thông tin ở trên.

Cách sử dụng dữ liệu đã đọc từ JSON

Framework RapidJSON cung cấp cho chúng ta một khối lượng các hàm mà tôi sẽ nói một vài hàm điển hình sau đây.

Truy cập các phần tử

m_document["hello"];

m_document["keys"]["string"];

m_document["array"][0];
m_document["array"][1];
  • Dòng 1: Truy cập phần tử trên cùng, có tên là "hello"
  • Dòng 3: Để truy cập tới "string" thì ta bắt buộc phải truy cập qua "keys"
  • Dòng 5,6: Truy cập tới phần tử  đầu tiên và thứ hai trong mảng

Xét kiểu dữ liệu của phần tử

Ta có các hàm như  sau:

  • IsString(): trả về true nếu giá trị của nó là string, ngược lại thì false
  • IsNumber(): trả về true nếu giá trị của nó là số, ngược lại thì false
  • IsObject(): trả về true nếu giá trị của nó là một object, ngược lại thì false
  • IsArray(): trả về true nếu giá trị của nó là một mảng dữ liệu, ngược lại thì false
  • IsBool(): trả về true nếu giá trị của nó là một phép luận lý, ngược lại thì false
  • IsNull(): trả về true nếu giá trị của nó là null, ngược lại thì false
  • ,... 

Đây là một ví dụ minh họa:

m_document["hello"].IsString();
m_document["hello"].IsNumber();
m_document["i"].IsNumber();

m_document["hello"].IsObject();
m_document["keys"].IsObject();

Kết quả:

true
false
true

false
true

Lấy dữ liệu từ các phần tử

Ta có các hàm như  sau:

  • GetString(): trả về giá trị là kiểu dữ liệu string của phần tử đó
  • GetInt(): trả về giá trị là kiểu dữ liệu int của phần tử đó
  • GetDouble(): trả về giá trị là kiểu dữ liệu double của phần tử đó
  • GetBool(): trả về giá trị là kiểu dữ liệu bool của phần tử đó
  • ,... 

Đây là một ví dụ minh họa:

string str = m_document["hello"].GetString();

bool variableT = m_document["t"].GetBool();

int variableI = m_document["i"].GetInt();

Xét xem có tồn tại phần tử 

m_document.HasMember("keys");
m_document.HasMember("string");
m_documenet["keys"].HasMember("string");

Kết quả:

true
false
true

Hàm trả về true nếu có phần tử, ngược lại thì false.

  • Dòng 3: Phải truy cập qua "keys" để xét, tương tự với việc truy cập

Kiểu dữ liệu Value

Để tiện lợi trong việc sử dụng các thông tin, ta còn được cung cấp kiểu dữ liệu Value như sau:

rapidjson::Value& m_doc1 = m_document["hello"];

Và ta có thể sử dụng nó:

m_doc1.IsString(); // tương tự với m_document["hello"].IsString();

Truy cập tất cả phần tử trong mảng

Để truy cập vào tất cả phần tử trong mảng ta có 2 cách sau:

Cách 1:

for (rapidjson::Value::ConstValueIterator itr = m_document["array"].Begin(); itr != m_document["array"].End(); ++itr)
{
   itr->IsInt();
}

Cách 2:

for (int i = 0; i < m_document["array"].Size(); ++i)
{
   m_document["array"][i].IsInt();
}

Truy cập tất cả phần tử trong Object

for (rapidjson::Value::ConstMemberIterator itr = _document.MemberBegin(); itr != _document.MemberEnd(); ++itr)
{
   itr->name.IsString(); 
   itr->value.IsString();
}
  • Truy cập tới các phần tử trong Object đó
  • Truy cập tới giá trị của các phần tử đó

Tổng kết

Trong bài viết này, tôi đã hướng dẫn cho các bạn các thao tác cơ bản với file JSON. Trong bài viết tiếp theo, tôi sẽ hướng dẫn thao tác file Plist trong Cocos2d-x.

Tham khảo

  • http://cocos2d-x.org/
  • http://rapidjson.org/
THẢO LUẬN
ĐÓNG