不知道改先说些什么,又是一个好久没写博客的阶段了啊~(很多童鞋也应该发现Himi隐匿了…)
最近一段时间呢,主要还是太忙,各种忙。对于博客,Himi自己的还是经常关注的,主要没有什么可写的了,哈哈。不过一旦有可以分享的,一定第一时间发出来~
好了 不闲扯了,今天来给童鞋们介绍如何在Cocos2dx中解析、封装JSON数据的教学。
首先了JSON相关知识:
1
<code>JSON</code><code>(</code><code>JavaScript Object Notation</code><code>)</code><code>是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA</code><code>-262</code><code>3rd</code><code>Edition </code><code>-</code><code>December </code><code>1999</code><code>)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C</code><code>,</code><code>C</code><code>+</code><code>+</code><code>,</code><code>C</code><code>#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。</code>
常用的几个版本包括C, C++, C#, Java, JavaScript, Perl, Python等
那么针对cocos2dx 我们应该使用c++的版本~
第一步: 下载cpp版本的json
第二步: 解压文件夹放置项目中即可使用
<code>导入头文件: </code><code>#include "jsoncpp/include/json/json.h"</code>
第三步:常用示例
3.1 先熟悉几个类名和函数:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code></code><code>/*</code>
<code></code><code>Value:写过脚本、弱语言的童鞋应该很清楚var,其他Value 和var一个道理,都是可以表示很多数据类型的数据类型,。</code>
<code></code><code>这话可能比较绕,简单说就是Value你可以理解可以是int 也可以是string 也可以是其他数据类型。</code>
<code></code><code>当然定义 Value value,只是个定义,还没有决定其数据类型,如果你Value value =10;那么value 就是个整型</code>
<code></code><code>在用于JSON时,我们常表示为一个map,其中包括 key-value,键值对</code>
<code></code><code>其中Value 中包括一些将其转为基础数据类型的6个方法,如下:</code>
<code></code><code>value.asCString();</code>
<code></code><code>value.asString();</code>
<code></code><code>value.asBool();</code>
<code></code><code>value.asDouble();</code>
<code></code><code>value.asInt();</code>
<code></code><code>value.asUInt();</code>
<code></code><code>*/</code>
<code>Json::FastWriter write;</code>
<code></code><code>FastWriter:起作用是将Value数据编码成JSON格式的数据</code>
<code></code><code>常用函数:write(<#const Json::Value &root#>)</code>
<code>Json::Reader reader;</code>
<code></code><code>Value:作用与FastWriter相反,是将JSON格式的数据解析成一个Value</code>
<code></code><code>常用函数: reader.parse(<#std::istream &is#>, <#Json::Value &root#>)</code>
以上是常用的类和函数已经注释说明的很清楚了,那么下面我们开始进行制作JSON数据、解析JSON数据等操作吧:
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<code></code><code>//创建JSON数据</code>
<code></code><code>//------先定义数据</code>
<code></code><code>Json::Value map;</code>
<code></code><code>map[</code><code>"name"</code><code>]=</code><code>"Himi"</code><code>;</code>
<code></code><code>map[</code><code>"age"</code><code>]=23;</code>
<code></code><code>//------编码成json数据</code>
<code></code><code>string jsonData =write.write(map);</code>
<code></code><code>CCLOG(</code><code>"jsonData:%s"</code><code>,jsonData.c_str());</code>
<code></code><code>//打印结果 Cocos2d: jsonData:{"age":23,"name":"Himi"}</code>
<code></code><code>//解析JSON数据</code>
<code></code><code>//--先将数据解析到 Value(parseData)中</code>
<code></code><code>Json::Value parseData;</code>
<code></code><code>reader.parse(jsonData, parseData);</code>
<code></code><code>Json::Value valueName = </code><code>"默认"</code><code>;</code>
<code></code><code>Json::Value valueAge = -1;</code>
<code></code><code>valueName = parseData.get(</code><code>"name"</code><code>, valueName);</code>
<code></code><code>valueAge = parseData.get(</code><code>"age"</code><code>, valueAge);</code>
<code></code><code>const</code><code>char</code><code>* nameStr =valueName.asCString() ;</code>
<code></code><code>int</code><code>age = valueAge.asInt();</code>
<code></code><code>CCLOG(</code><code>"name:%s,age:%d"</code><code>,nameStr,age);</code>
<code></code><code>//打印结果:Cocos2d: name:Himi,age:23</code>
<code></code><code>//使用get函数时,第一个参数是key的名, 第二个参数是如果找不到对应key的默认Value</code>
<code></code><code>//举例我们将name和age,故意写错:</code>
<code>// Json::Value parseData;</code>
<code>// reader.parse(jsonData, parseData);</code>
<code>//</code>
<code>// Json::Value valueName = "默认";</code>
<code>// Json::Value valueAge = -1;</code>
<code>// valueName = parseData.get("nameHimi", valueName);</code>
<code>// valueAge = parseData.get("ageHimi", valueAge);</code>
<code>// const char* nameStr =valueName.asCString() ;</code>
<code>// int age = valueAge.asInt();</code>
<code>// CCLOG("name:%s,age:%d",nameStr,age);</code>
<code></code><code>//打印结果:Cocos2d: name:默认,age:-1</code>
<code></code><code>//复杂一点JSON的编写和解析</code>
<code></code><code>Json::Value root;</code>
<code></code><code>Json::Value array;</code>
<code></code><code>array[</code><code>"arrKey1"</code><code>]=</code><code>"arrValue1"</code><code>;</code>
<code></code><code>array[</code><code>"arrKey2"</code><code>]=</code><code>"arrValue2"</code><code>;</code>
<code></code><code>array[</code><code>"arrKey3"</code><code>]=</code><code>"arrValue3"</code><code>;</code>
<code></code><code>root[</code><code>"arrayKey"</code><code>] =array;</code>
<code></code><code>string hJsonData = write.write(root);</code>
<code></code><code>CCLOG(</code><code>"复杂一点的JSON格式数据:%s"</code><code>,hJsonData.c_str());</code>
<code></code><code>//打印结果 Cocos2d: 复杂一点的JSON格式数据:{"arrayKey":{"arrKey1":"arrValue1","arrKey2":"arrValue2","arrKey3":"arrValue3"}}</code>
<code></code><code>Json::Value parseRoot;</code>
<code></code><code>Json::Value parseArray;</code>
<code></code><code>reader.parse(hJsonData, parseRoot);</code>
<code></code><code>parseArray = parseRoot.get(</code><code>"arrayKey"</code><code>, parseArray);</code>
<code></code><code>CCLOG(</code><code>"解析出的数据:%s,%s,%s"</code><code>,</code>
<code></code><code>parseArray.get(</code><code>"arrKey1"</code><code>,NULL).asCString(),</code>
<code></code><code>parseArray.get(</code><code>"arrKey2"</code><code>,NULL).asCString(),</code>
<code></code><code>parseArray.get(</code><code>"arrKey3"</code><code>,NULL).asCString());</code>
<code></code><code>//打印结果:Cocos2d: 解析出的数据:arrValue1,arrValue2,arrValue3</code>
整体来说JSON CPP 还是很非常好用的,就不多扯了~ 再复杂的数据只要会了如上,基本就全OK;
需要注意的两点:
1. 使用Value的get函数时,如果你传入第二个参数(默认Value),那么一定要将获得的结果赋值给第二个参数,防止get函数找到对应Key时,Value没人要的问题发生。如下:
Json::Value value;
value = xx .get(“key”,value);
当然你很确定key,你也可以:
Value value = xx .get(“key”,NULL);
2.使用get获取的value,一定要注意其数据类型,不要获取的是个整型,还要使用asCString()函数转换。
下面我们来学习如何添加新字体库:
步骤一:找一个ttf字体库
步骤二:找到这个ttf字体库的真实名称
打开你的应用 “字体册”(MAC OS系统下),如下图操作):
<a href="http://www.himigame.com/wp-content/uploads/2013/11/asdf.png" target="_blank"></a>
找到了字体库真实名称,那么修改将其真名作为为此新的字体库名称即可。
然后将其加入你的项目中即可使用
步骤三:
打开Xcode项目资源下的info.plist文件:
然后右键 “Add Row”,添加“Fonts provided by application ”条目,如下图:
(将新加的字体库真名加入此条目列表下即可)
<a href="http://www.himigame.com/wp-content/uploads/2013/11/QQ20131108-5.png" target="_blank"></a>
剩下,我们书写测试代码:
<code>//使用系统自带字体库</code>
<code>CCLabelTTF* pLabel = CCLabelTTF::create(</code><code>"自带字体库"</code><code>, </code><code>"Thonburi"</code><code>, 50);</code>
<code>CCSize size = CCDirector::sharedDirector()->getWinSize();</code>
<code>pLabel->setPosition( ccp(size.width / 2, size.height*0.5 + 30) );</code>
<code>this</code><code>->addChild(pLabel, 1);</code>
<code>//使用新加的字体库</code>
<code>CCLabelTTF* pLabelHimi = CCLabelTTF::create(</code><code>"Himi 新加字体库"</code><code>, </code><code>"DFKanTingLiuW9.ttf"</code><code>, 50);</code>
<code>pLabelHimi->setPosition( ccp(size.width / 2, size.height*0.5 - 40) );</code>
<code>this</code><code>->addChild(pLabelHimi, 1);</code>
运行效果图如下图所示:
<a href="http://www.himigame.com/wp-content/uploads/2013/11/QQ20131108-6.png" target="_blank"></a>
需要注意一点: 使用新加的字体库,那么创建CCLabelTTF时,传入的字体名是要有”.ttf”后缀的!
OK,本章就到这里~ 希望对大家有所帮助!
本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/1322253,如需转载请自行联系原作者