Cocos2d-x 3.0 joins the Rapidjson library for JSON parsing. Located under External/json.
Rapidjson Project Address: http://code.google.com/p/rapidjson/wiki:http://code.google.com/p/rapidjson/wiki/UserGuide
The following is an example code explaining the use of Rapidjson.
Parsing JSON strings using Rapidjson
Introducing Header Files
12 |
#include "json/rapidjson.h" #include "json/document.h" |
JSON parsing
12345678910111213 |
std::string str =
"{\"hello\" : \"word\"}"
;
CCLOG(
"%s\n"
, str.c_str());
rapidjson::Document d;
d.Parse<0>(str.c_str());
if (d.HasParseError())
//打印解析错误
{
CCLOG(
"GetParseError %s\n"
,d.GetParseError());
} if (d.IsObject() && d.HasMember(
"hello"
)) {
CCLOG(
"%s\n"
, d[
"hello"
].GetString());
//打印获取hello的值
}
|
Print results
123 |
cocos2d: { "hello" : "word" } cocos2d: word |
Note: Only the standard JSON format is supported, and some non-standard JSON formats are not supported.
Some common parsing methods need to be packaged themselves. Be careful to determine if the resolution node exists.
Using Rapidjson to generate JSON strings
Introducing Header Files
1234 |
#include "json/document.h" #include "json/writer.h" #include "json/stringbuffer.h" using namespace rapidjson; |
Generating a JSON string
12345678910111213141516171819 |
rapidjson::Document document;
document.SetObject();
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
rapidjson::Value array(rapidjson::kArrayType);
rapidjson::Value object(rapidjson::kObjectType);
object.AddMember(
"int"
, 1, allocator);
object.AddMember(
"double"
, 1.0, allocator);
object.AddMember(
"bool"
,
true
, allocator);
object.AddMember(
"hello"
,
"你好"
, allocator);
array.PushBack(object, allocator);
document.AddMember(
"json"
,
"json string"
, allocator);
document.AddMember(
"array"
, array, allocator);
StringBuffer buffer;
rapidjson::Writer<StringBuffer> writer(buffer);
document.Accept(writer);
CCLOG(
"%s"
,buffer.GetString());
|
Print results
1 |
cocos2d: { "json" : "json string" , "array" :[{ "int" :1, "double" :1, "bool" : true |
Cocos2d-x has added tinyxml2
parsing for XML. Version 3.0 is located external/tinyxml2
under. The 2.x version is located cocos2dx/support/tinyxml2
under.
TINYXML2 GitHub Address: HTTPS://GITHUB.COM/LEETHOMASON/TINYXML2
Help document Address: http://grinninglizard.com/tinyxml2docs/index.html
Generating an XML document
Introducing Header Files
12 |
#include "tinyxml2/tinyxml2.h" using namespace tinyxml2; |
XML document Generation
123456789101112131415161718192021222324252627282930313233343536373839404142 |
void
HelloWorld::makeXML(
const char *fileName)
{
std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;
XMLDocument *pDoc =
new XMLDocument();
//xml 声明(参数可选)
XMLDeclaration *pDel = pDoc->NewDeclaration(
"xml version=\"1.0\" encoding=\"UTF-8\""
);
pDoc->LinkEndChild(pDel);
//添加plist节点
XMLElement *plistElement = pDoc->NewElement(
"plist"
);
plistElement->SetAttribute(
"version"
,
"1.0"
);
pDoc->LinkEndChild(plistElement);
XMLComment *commentElement = pDoc->NewComment(
"this is xml comment"
);
plistElement->LinkEndChild(commentElement);
//添加dic节点
XMLElement *dicElement = pDoc->NewElement(
"dic"
);
plistElement->LinkEndChild(dicElement);
//添加key节点
XMLElement *keyElement = pDoc->NewElement(
"key"
);
keyElement->LinkEndChild(pDoc->NewText(
"Text"
));
dicElement->LinkEndChild(keyElement);
XMLElement *arrayElement = pDoc->NewElement(
"array"
);
dicElement->LinkEndChild(arrayElement);
for (
int i = 0; i<3; i++) {
XMLElement *elm = pDoc->NewElement(
"name"
);
elm->LinkEndChild(pDoc->NewText(
"Cocos2d-x"
));
arrayElement->LinkEndChild(elm);
}
pDoc->SaveFile(filePath.c_str());
pDoc->Print();
delete pDoc;
}
|
Print results
123456789101112 |
<?xml version=
"1.0" encoding=
"UTF-8"
?>
<plist version=
"1.0"
>
<!--
this is xml comment-->
<dic>
<key>Text</key>
<array>
<name>Cocos2d-x</name>
<name>Cocos2d-x</name>
<name>Cocos2d-x</name>
</array>
</dic>
</plist>
|
The above code uses TinyXML to simply generate an XML document.
Parsing xmlHere we will parse the XML document created above
Introducing Header Files
12 |
#include "tinyxml2/tinyxml2.h" using namespace tinyxml2; |
XML parsing
1234567891011121314151617181920212223242526272829303132333435 |
void HelloWorld::parseXML(
const char *fileName)
{
std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;
XMLDocument *pDoc =
new XMLDocument();
XMLError errorId = pDoc->LoadFile(filePath.c_str());
if (errorId != 0) {
//xml格式错误
return
;
} XMLElement *rootEle = pDoc->RootElement();
//获取第一个节点属性
const XMLAttribute *attribute = rootEle->FirstAttribute();
//打印节点属性名和值
log
(
"attribute_name = %s,attribute_value = %s"
, attribute->Name(), attribute->Value());
XMLElement *dicEle = rootEle->FirstChildElement(
"dic"
);
XMLElement *keyEle = dicEle->FirstChildElement(
"key"
);
if (keyEle) {
log
(
"keyEle Text= %s"
, keyEle->GetText());
}
XMLElement *arrayEle = keyEle->NextSiblingElement();
XMLElement *childEle = arrayEle->FirstChildElement();
while ( childEle ) {
log
(
"childEle Text= %s"
, childEle->GetText());
childEle = childEle->NextSiblingElement();
}
delete pDoc;
}
|
In the process of node parsing, pay attention to the empty processing of the obtained node.
Parsing results Printing
12345 |
cocos2d: attribute_name = version,attribute_value = 1.0 cocos2d: keyEle Text= Text cocos2d: childEle Text= Cocos2d-x cocos2d: childEle Text= Cocos2d-x cocos2d: childEle Text= Cocos2d-x |
SummaryThe simple example above demonstrates how to use TinyXML for XML document generation and parsing. For more detailed help, please refer to the TinyXML Help documentation http://grinninglizard.com/tinyxml2docs/index.html
Cocos2d-x 3.0 JSON Usage cocos2d-x XML parsing