json是一種輕量級的數據結構,相比起XML具有解析效率高等優點。
首先我們看一json的結構如下:
{
"name":"yokia",
"age":24
}
結構簡潔,name="yokia",age=24,有點像map,這正是我們所需要的。在c++與flex中使用json,我們需要幾個額外的包來解析json。
c++中我們使用jsoncpp這個包,flex中我們使用corelib.swc。我們將jsoncpp中的源文件複製到項目,corelib.swc拷到flex項目的libs下。
我們來看c++中的接收代碼:
char *buff = (char *)malloc(126); //緩衝區
int retVal = recv(s,buff,126,0); //接收數據
buff[retVal] = '\0'; //增加結束符
string str = buff; //將char *類型數據轉換成string
JSON::Reader reader; //json中的一個讀取類
JSON::Value value; //json中存儲數據類
if(reader.parse(str,value)) //將數據讀取到value中
{
string name;
int age;
if(!value["name"].isNull()) name= value["age"].asString(); //若name不是空,則讀取
if(!value["age"].isNull()) age= value["age"].asInt(); //若age不是空,則讀取
cout<<"name:"<<name<<","<<"age:"<<age<<endl; //輸出name和age
}
至此,我們已將數據解析成json,並進行處理。
上面將buff轉成string類型,注意char *僅僅是一個地址,將數據轉換成string後,便可以利用jsoncpp中的函數解析成json了。這樣,c++只需要知道flex傳過來的key值,便可獲取value值。
接下來我們看下flex中的代碼,在flex連接c++成功後:
import com.adobe.serialization.json.*; //導入json包
var jsonObj:Object = new Object(); //Object對象
var jsonStr:String; //String對象
jsonObj.name = "vigour"; //賦值
jsonObj.age = 24; //賦值
jsonStr = JSON.encode(jsonObj); //利用JSON的encode方法將Object轉換成String類型
var msg:ByteArray=new ByteArray();
msg.writeUTFBytes(jsonStr); //設置發送對象
_socket.writeObject(msg); //發送數據
_socket.flush();
以上我們便將數據發送到c++服務器了。。其中JSON.encode是將Object類型轉換成String,當然也有將String轉換成Object,那便是JSON.decode(String str),這樣便可將c++服務器傳來的string轉換成flex中的Object。
通過以上操作,我們便可實現c++與flex之間利用json進行通信。雙方不需要聲明任何數據結構,只需要知道KEY值便可。