本文共 3606 字,大约阅读时间需要 12 分钟。
Cocos2d-x 3.x 引入了 rapidjson 库,为开发者提供了强大的 JSON 数据处理能力。通过本节教程,你将学会如何在游戏中使用 JSON 数据存储和解析,并将这些内容应用到实际项目中。
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式,类似于 XML,但具有更小的尺寸和更高的解析效率。以下是 JSON 的主要特点:
JSON 语法以括号和花括号为主要结构符号,其核心规则如下:
{} 包裹,包含多个键值对。[ ] 包裹,包含多个值(可以是 null、布尔值、数字、字符串、对象或数组)。null、布尔值(true、false)、数字(包括浮点数)、字符串(双引号包裹)和数组、对象。Cocos2d-x 3.x 集成的 rapidjson 库,可以帮助你轻松解析标准格式的 JSON 文件。以下是详细的解析步骤:
#include "json/rapidjson.h"#include "json/document.h"#include "json/stringbuffer.h"#include "json/writer.h"
// 读取文件内容std::string jsonStr = FileUtils::getInstance()->getStringFromFile("testJson.json");// 创建 rapidjson 文档对象rapidjson::Document d;d.Parse(jsonStr.c_str(), 0); // 0 表示默认解析标志if (d.HasParseError()) { // 处理错误信息 CCLOG("GetParseError %s\n", d.GetParseError()); return;}// 检查是否为对象格式if (d.IsObject()) { // 获取 "hello" 属性的值 if (d.HasMember("hello")) { CCLOG("%s", d["hello"].GetString()); } // 获取数组值 if (d.HasMember("array")) { rapidjson::Value arr = d["array"]; for (int i = 0; i < arr.Size(); i++) { CCLOG("%d: %d", i, arr[i].GetInt()); } } // 获取对象嵌套值 if (d.HasMember("object")) { rapidjson::Value obj = d["object"]; if (obj.IsObject()) { CCLOG("%s:%s", d["object"]["name"].GetString(), d["object"]["age"].GetInt()); } }}if (d.IsArray()) { rapidjson::Value arr = d; for (int i = 0; i < arr.Size(); i++) { CCLOG("%d is Bool: %d", i, arr[i].GetBool()); CCLOG("%d is Number: %d", i, arr[i].GetInt()); CCLOG("%d is String: %s", i, arr[i].GetString()); if (arr[i].IsObject()) { CCLOG("%d is Object: %s", i, arr[i]["name"].GetString()); CCLOG("%d is Object: %d", i, arr[i]["age"].GetInt()); } }}要将 JSON 数据存储到文件中,步骤如下:
rapidjson::Document d;d.SetArray(); // 设置为数组格式
// 添加文档中的数据d.AddMember("int", 1); // 添加整数值d.AddMember("double", 1.1); // 添加双精度浮点数d.AddMember("hello", "world"); // 添加字符串// 添加数组rapidjson::Value array(rapidjson::kArrayType);array.PushBack(123); // 添加数字array.PushBack("hello"); // 添加字符串array.PushBack({"name": "alice", "age": 23}); // 添加对象d.AddMember("array", array); // 将数组添加到文档中// 创建 buffer 简易缓冲区StringBuffer buffer;rapidjson::Writerwriter(buffer);d.Accept(writer); // 使用 writer 接受文档// 将内容写入文件FILE* file = fopen("testJson.json", "wb");if (file != nullptr) { fputs(buffer.GetString(), file); fclose(file);}
以下是 JSON 数据操作的通用方法:
if (d.HasMember("key")) { // 节点存在} else { // 节点不存在 d.AddMember("key",erratedValue, allocator); // 适当添加默认值}rapidjson::Value array = d["array"];array.PushBack(456); // 添加值array.Space(); // 可选:添加空格以美化格式array.Sort(); // 可选:对数组值进行排序
rapidjson::Value object = d["object"];if (object.IsObject()) { object.AddMember("new_key", value, allocator); // 根据需要添加或修改成员}rapidjson::Value value = d["key"];switch (value.GetType()) { case rapidjson::Type::kObjectType: // 处理对象 break; case rapidjson::Type::kArrayType: // 处理数组 break; default: // 其他类型}d["key"].SetString("修改后的值");d["array"][0].SetInt(99);// 或者直接修改数组或对象的值通过以上方法,你可以方便地在游戏项目中读取、存储和操作 JSON 数据,充分发挥其便捷性和高效性。
转载地址:http://qhedz.baihongyu.com/