博客
关于我
Cocos2d-x数据模块教程02:Json数据操作
阅读量:493 次
发布时间:2019-03-07

本文共 3606 字,大约阅读时间需要 12 分钟。

Cocos2d-x 3.x JSON数据操作教程

Cocos2d-x 3.x 引入了 rapidjson 库,为开发者提供了强大的 JSON 数据处理能力。通过本节教程,你将学会如何在游戏中使用 JSON 数据存储和解析,并将这些内容应用到实际项目中。


JSON简介

JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式,类似于 XML,但具有更小的尺寸和更高的解析效率。以下是 JSON 的主要特点:

  • 存储和传输数据:JSON 既可以存储结构化数据,也可以使用来传输文本数据。
  • 基于键值对:数据以键值对的形式存储,每个键名由字符串表示,每个值可以是 null、布尔值、数字、字符串或其他 JSON 数据结构(如对象或数组)。
  • 语言独立:虽然 JSON 语法受 JavaScript 影响,但 JSON 本身并非与特定语言或平台耦合。

  • JSON 语法规则

    JSON 语法以括号和花括号为主要结构符号,其核心规则如下:

  • 键值对:键名(必须用双引号括起来)后面跟一个冒号,值可以是任意数据类型。
  • 数据结构
    • 对象:由花括号 {} 包裹,包含多个键值对。
    • 数组:由方括号 [ ] 包裹,包含多个值(可以是 null、布尔值、数字、字符串、对象或数组)。
  • 值类型:JSON 支持 null、布尔值(truefalse)、数字(包括浮点数)、字符串(双引号包裹)和数组、对象。

  • 使用 rapidjson 库解析 JSON 文件

    Cocos2d-x 3.x 集成的 rapidjson 库,可以帮助你轻松解析标准格式的 JSON 文件。以下是详细的解析步骤:

  • 添加必要头文件:在你的项目中包含以下头文件:
    #include "json/rapidjson.h"#include "json/document.h"#include "json/stringbuffer.h"#include "json/writer.h"
  • 解析 JSON 文件
    // 读取文件内容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;}
  • 操作 JSON 数据
    // 检查是否为对象格式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 数据存储

    要将 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::Writer
    writer(buffer);d.Accept(writer); // 使用 writer 接受文档// 将内容写入文件FILE* file = fopen("testJson.json", "wb");if (file != nullptr) { fputs(buffer.GetString(), file); fclose(file);}

  • 常用 JSON 操作

    以下是 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/

    你可能感兴趣的文章
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错TypeError: this.getOptions is not a function
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用操作---npm工作笔记003
    查看>>