最近想寫一個自訂的動畫資料檔案,按照原來的做法,先定義一個文字格式設定的資料檔案,然後寫一個轉換器轉換成二進位,然後遊戲中讀入並解析。不過我最近特別懶,雖然我已經設計了一個“萬能的”文字格式設定和二進位轉換工具,但是解析二進位檔案的工作仍然繁瑣,並且根據以往的經驗,可能會經常的修改檔案格式,於是我想直接使用文字格式設定吧,首先想到的是XML,不過最近實在太懶了,連XML都懶得去解析,嗯,還有google Protocol Buffers這東西,以前看過,不過似乎用的人不多啊,還有一個json,見人在遊戲中用過,那麼就試試他吧。。
找了幾個c++的json解析器,最後選中了jsoncpp (http://jsoncpp.sourceforge.net )。首先jsoncpp是public domain的,那麼就隨便我怎麼用了,太爽了,然後他使用的是標準c++,沒有任何其他依賴(某些庫還要依賴boost等東西),最後他很小巧,只有15個源檔案,我直接把這些檔案copy到工程裡就編譯了,省去了lib的配置編譯串連設定等等(既然懶就懶到底了。。。),直接看文檔,用法非常簡單,我寫了一個簡單的json檔案作為測試(其實是用jsoncpp的styled writer寫的。。)
[javascript] view plaincopyprint?
- {
- "float test" : 1.0,
- "interger test" : 1,
- "obj" : {
- "a" : "obja",
- "b" : "objb",
- "c" : 0.130
- },
- "str test" : "hello json!"
- }
{<br /> "float test" : 1.0,<br /> "interger test" : 1,<br /> "obj" : {<br /> "a" : "obja",<br /> "b" : "objb",<br /> "c" : 0.130<br /> },<br /> "str test" : "hello json!"<br />}
測試代碼:
[cpp] view plaincopyprint?
- #include "json/json.h"
- #include <fstream>
- void testJson()
- {
- std::ifstream infile("test.json");
- Json::Value root;
- Json::Reader reader;
- bool ok = reader.parse(infile,root); //直接傳入一個ifstream就可以了,全部解析到root中,當然檔案可別太大。。對我來說這種DOM的方式是很適合的
- if(!ok)
- {
- return;
- }
- std::string name = root.get("str test","").asString(); //測試讀入屬性值
- std::cout<<name<<std::endl;
- //測試寫入屬性值,可直接產生新的索引值對,以及對象,其實我之前的test.json是個空的,都是在這兒寫入的
- root["interger test"] = 1;
- root["float test"] = 1.0f;
- root["obj"]["a"] = "obja";
- root["obj"]["b"] = "objb";
- root["obj"]["c"] = 0.13;
- Json::StyledWriter writer;
- std::string output = writer.write(root);
- std::cout<<output;
- //直接寫入檔案,搞定
- std::ofstream file("test.json");
- file<<output;
- }
#include "json/json.h"<br />#include <fstream><br />void testJson()<br />{<br /> std::ifstream infile("test.json");<br /> Json::Value root;<br /> Json::Reader reader;<br /> bool ok = reader.parse(infile,root); //直接傳入一個ifstream就可以了,全部解析到root中,當然檔案可別太大。。對我來說這種DOM的方式是很適合的<br /> if(!ok)<br /> {<br /> return;<br /> }<br /> std::string name = root.get("str test","").asString(); //測試讀入屬性值<br /> std::cout<<name<<std::endl;<br /> //測試寫入屬性值,可直接產生新的索引值對,以及對象,其實我之前的test.json是個空的,都是在這兒寫入的<br /> root["interger test"] = 1;<br /> root["float test"] = 1.0f;<br /> root["obj"]["a"] = "obja";<br /> root["obj"]["b"] = "objb";<br /> root["obj"]["c"] = 0.13;<br /> Json::StyledWriter writer;<br /> std::string output = writer.write(root);<br /> std::cout<<output;<br /> //直接寫入檔案,搞定<br /> std::ofstream file("test.json");<br /> file<<output;<br />}
使用jsoncpp簡直太輕鬆了,我一句解析代碼都沒有寫,直接從檔案得到了json對象,有了json對象你就可以向你的遊戲資料對象寫入值了,或者作為早期的測試,直接使用json對象也未嘗不可