博客
关于我
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/

    你可能感兴趣的文章
    Openlayers实战:界面控制综合演示
    查看>>
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:绘制带箭头的线
    查看>>
    Openlayers实战:绘制矩形,正方形,正六边形
    查看>>
    Openlayers实战:自定义放大缩小,显示zoom等级
    查看>>
    Openlayers实战:自定义版权属性信息
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
    查看>>
    Openlayers实战:非4326,3857的投影
    查看>>
    Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>