前言

在游戏开发过程中,读取配置文件是必不可少的,而使用JSON做配置文件又比较常见,本文重点给大家讲述如何在Cocos Creator开发中读取和解析JSON数据文件以及如何写JSON文件。

一、JSON简介

1. 什么是JSON

JSON的英文全称是JavaScript Object Notation,即JavaScript对象表示法。

2. JSON的特点

是一种轻量级的文本数据交换格式,类似XML,但是比XML更小、更快、更易解析。使用JavaScript语法来描述数据对象,JS程序无需解析器即可生成原生的JavaScript对象。独立于语言和平台,目前大多数的编程语言都支持JSON。

3. JSON的语法

JSON语法是JavaScript语法的子集,具有以下规则:

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

二、如何解析JSON文件

1. 关键原则

大括号代表对象,中括号代表数组;

2. 用什么方法读取?

Cocos Creator提供了cc.load.loadRes来专门加载位于 resources 目录下的文件,所以提前把JSON文件放到 asserts/resources 目录下即可。先来一个简单的JSON文件,如下:

1.  `// box2dDemo.json`2.  `{`3.  `"engine": "Box2D",`4.  `"version": "2.3.1"`5.  `}`

读取/解析代码如下:

1.  `cc.loader.loadRes('box2dDemo.json', function(err, object) {`2.  `if(err) {`3.  `console.log(err);`4.  `return;`5.  `}`6.  `// 读取的数据返回在object中,这是一个拥有2个元素的对象`7.  `let engine = object.engine; // engine = box2D`8.  `let ver = object.version; // ver = 2.3.1`9.  `});`

是不是很简单?实际使用的JSON配置常常比这复杂一些,所以我们现在再给JSON文件增加一些元素,如下:

1.  `// box2dDemo.json`2.  `{`3.  `"engine": "Box2D",`4.  `"version": "2.3.1",`5.  `"bodies":`6.  `[`7.  `{`8.  `"name": "root",`9.  `"body":`10.  `{`11.  `"type": "static",`12.  `"gravityScale": 0.2`13.  `}`14.  `},`15.  `{`16.  `"name": "aa1",`17.  `"body":`18.  `{`19.  `"type": "static",`20.  `"gravityScale": 0.2`21.  `}`22.  `}`23.  `],`24.  `"joints":`25.  `[`26.  `{`27.  `"bodyA": "root",`28.  `"bodyB": "aa1",`29.  `"lowerAngle": 0.5,`30.  `"enableLimit": true`31.  `},`32.  `{`33.  `"bodyA": "aa1",`34.  `"bodyB": "aa2",`35.  `"lowerAngle": -0.5,`36.  `"enableLimit": true`37.  `}`38.  `]`39.  `}`

我们在代码中定义一个解析函数叫 readJson,并且把解析出来的JSON数据保存起来,实现代码如下:

1.  `readJson: function() {`2.  `this.box2d = {}; // 存储解析出来的JSON数据`3.  `varself= this;`4.  `cc.loader.loadRes('box2dDemo.json', function(err, object) {`5.  `if(err) {`6.  `console.log(err);`7.  `return;`8.  `}`9.  `let engine = object.engine; // engine = box2D`10.  `let ver = object.version; // ver = 2.3.1`11.  `let bodies = object.bodies; // bodies是个数组`12.  `let joints = object.joints; // joints是个数组`13.  `// 需在回调外面提前用self代替this`14.  `self.box2d = object; // box2d是整个对象`15.  `// 将循环2次,因为bodies是个拥有2个对象的数组`16.  `for(let x=0; x < bodies.length; x++) {`17.  `let root = bodies[x]; // root是个对象`18.  `let root_name = root.name; // 第1次循环root_name = root`19.  `let type = root.body.type; // type = static`20.  `let gravity = root.body.gravityScale; // gravity = 0.2`21.  `}`22.  `});`23.  `},`

3. Cocos Creator读取JSON文件注意事项

creator读取json文件的一个坑(对文本内容进行操作可能导致的错误) 使用creator中的 cc.loader.loadRes( url, cc.RawAsset, ( err, res )=>{ } )读取游戏文件后发现第二次进入游戏出现了错误。现对这个问题总结下:对于动态加载资源,第二次读取会直接从缓存中读取,所以如果读取的是一个文本数据,对文本数据修改了,那么相应的,在下一次读取数据会读取修改后的文本数据。比如文本数据就一个数组[1,2,3],第一次读取之后删除了最后一位数据变为为[1,2],那么下一次读取将会是[1,2]。为了不出现这种情况,可以对数据进行序列化与反序列化操作,将其深度拷贝后使用。

4. JSON读取通用代码示例

1.  `cc.loader.load(cc.url.raw('resources/data.json'), function(err,res){`2.  `if(err) {`3.  `cc.log(err);`4.  `}else{`5.  `let list=res;`6.  `cc.log("load:");`7.  `cc.log("list:"+list.name);`8.  `}`9.  `});`10.  `// louadRes()方法,默认路径就是resources`11.  `cc.loader.loadRes('data', function(err,res){`12.  `if(err) {`13.  `cc.log(err);`14.  `}else{`15.  `let list=res;`16.  `cc.log("loadRes:");`17.  `cc.log("list:"+list.sex);`18.  `}`19.  `});`

注意:当使用以上代码还报文件不存在或Download text failed的错,那就要检查下资源管理器里是不是有两个resources文件夹,其中一个是最近新建的,另一个可能是以前新建的但是被删除过,但是删除不彻底,因为cocos creator里面的资源都是有一个唯一标识的uuid,所以,还必须找到E:Projects你的项目libraryuuid-to-mtime.json这个文件,在里面找到之前的resources文件uuid,先剪切放到文本文件,然后保存uuid-to-mtime.json,重启软件,看是否能进去,不能的话再把剪切出来的uuid复制回去,再重启就可以了。

三、Json文件的写入

1.  `// writeToFile()写入数据到文件,存储格式为xml,不是Json格式`2.  `if(cc.sys.isNative) {`3.  `cc.log("Path:"+jsb.fileUtils.getWritablePath());    cc.log( jsb.fileUtils.writeToFile({"new":"value"},jsb.fileUtils.getWritablePath()+'data.json'));`4.  `cc.log("fullPathForFilename:"+jsb.fileUtils.fullPathForFilename("resources/data.json"));`5.  `}`6.  `// writeStringToFile()写入数据到文件,存储格式为json,读取数据用load()方法`7.  `cc.log("writeStringToFile:"+jsb.fileUtils.writeStringToFile('{"a":"b","c":"d"}', jsb.fileUtils.getWritablePath()+'kk.json'));`8.  `cc.log("getValueMapFromFile:"+JSON.stringify(jsb.fileUtils.getValueMapFromFile(jsb.fileUtils.getWritablePath()+"kk.json")));``var`9.  `arry=JSON.stringify(jsb.fileUtils.getStringFromFile(jsb.fileUtils.getWritablePath()+"kk.json"));`10.  `cc.log("arry:"+arry);`11.  `cc.loader.load(jsb.fileUtils.getWritablePath()+"kk.json", function(err,res){`12.  `if(err) {`13.  `cc.log(err);`14.  `}else{`15.  `let list=res;`16.  `cc.log("list:"+list.a);`17.  `}`18.  `});`

cocos、unity、lay游戏大礼包,如需获取请点击下方即可:

超详细的面试学习核心笔记免费获取:游戏开发基础+Unity+Cocos+Laya+Ue4+Redis+微信小游戏+游戏服务器全家桶​shimo.im

json list格式_来来来,一文让你读懂Cocos Creator如何读写JSON文件相关推荐

  1. 机器学习中为什么需要梯度下降_机器学习101:一文带你读懂梯度下降

    原标题 | Machine Learning 101: An Intuitive Introduction to Gradient Descent 作者 | Thalles Silva 译者 | 汪鹏 ...

  2. 残差神经网络_什么是残差——一文让你读懂GBDT(梯度提升树)-和-Resnet-(残差网络)的原理...

    残差 残差在数理统计中是指实际观察值与估计值(拟合值)之间的差.在集成学习中可以通过基模型拟合残差,使得集成的模型变得更精确:在深度学习中也有人利用layer去拟合残差将深度神经网络的性能提高变强.这 ...

  3. au加载默认的输入和输出设备失败_一文带你读懂 C/C++ 语言输入输出流与缓存区...

    (给CPP开发者加星标,提升C/C++技能) 作者:技术让梦想更伟大 / 李肖遥 (本文来自作者投稿) 前言 有没有发现,基本上所有的C语言入门书籍,或者是我们的教程里面,第一个C语言程序实体,都是& ...

  4. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  5. 机器手六维坐标怎么定义_从基础到实操,一本书读懂ABB工业机器人

    工业机器人是集机械.电子.控制.计算机.传感器.人工智能等多学科先进技术于一体的机电一体化设备,被称为工业自动化的三大支柱技术之一.随着社会的进步和劳动力成本的增加,工业机器人在我国的应用已越来越广. ...

  6. java ascii码转字符_一文让你读懂JAVA.IO、字符编码、

    1 JAVA.IO字节流 inputstream.png LineNumberInputStream和StringBufferInputStream官方建议不再使用,推荐使用LineNumberRea ...

  7. elm分类器功能_一文带你读懂线性分类器

    本文为 AI 研习社编译的技术博客,原标题 : Linear Classifier 作者 | Thomas Pernet 翻译 | 邓普斯•杰弗.涂世文.Disillusion 校对 | 邓普斯•杰弗 ...

  8. 用户关注模型设计_一文带你读懂PKPMPC如何实现协同设计

    ▲ 点击上方蓝字,关注PKPM官方公众号! 文章作者:樊昊(BIM软件技术支持组)  0  . 前言 经过实际项目验证,PKPM-PC作为专业的装配式混凝土建筑设计软件已逐步取得国内市场的认可.目前国 ...

  9. 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法

    国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...

最新文章

  1. 美国政府签署网络安全行政令 将全面加强网络安全建设
  2. JAVA1100集,唤醒错误11002
  3. 平台服务器测试3—接口测试工具实现
  4. xml 中插入html代码
  5. 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)
  6. MySQL 最全优化指南
  7. 宝塔反代默认缓存了html吗,宝塔面板安装 OneList 设置反代
  8. Java基础学习总结(155)——Java 日志框架怎么选?Logback Or Log4j2?
  9. JSP指令标记和动作标记
  10. 关于LINUX输入法候选框光标跟随的代码的一个网页
  11. css 多行文本的溢出显示省略号(移动端)
  12. 《数据库原理》— 数据库系统概论第五版习题解析
  13. Flash遮罩之放大镜
  14. 神经网络做多元线性回归,神经网络是线性模型吗
  15. 湖南大学计算机专业毕业生待遇,分享湖南大学2017年毕业生就业基本情况及质量薪资...
  16. 一名爱折腾人士的Apps for iPhone分享
  17. transition过渡的基本使用
  18. 【python】算术运算报错can‘t multiply sequence by non-int of type ‘float‘
  19. 内向的孩子学医好还是学计算机好,什么性格适合学医 哪种人不适合学医
  20. BFS——1253 胜利大逃亡

热门文章

  1. python3多线程爬虫_【Python3 爬虫】U23_多线程爬虫之初识多线程
  2. rds本地库到rds恢复_华为云RDS备份导入到本地
  3. status c语言_C/C++编程笔记:C语言编程风格个人总结,初学小白可借鉴
  4. Ran out of input
  5. centos7进入用户模式修改root用户名
  6. xgboost每次迭代取得最优值方法
  7. mysql5.2 软件园_MySQL Server V5.5 官方安装版
  8. 二叉树的非递归遍历(统一的模板)
  9. Amazon Elasticsearch Service 入门实践
  10. 【文档】软件版本发布说明