Qt之JSON生成與解析

Qt之JSON生成與解析

 
  JSON(JavaScript ObjectNotation)是一種輕量級的數據交換格式。它基於JavaScript(Standard ECMA-262 3rd Edition- December 1999)的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

常用的Json庫
  • JsonCpp
   JsonCpp是一個C++用來處理JSON數據的開發包。
  • cJSON
   cJSON一個超輕巧,攜帶方便,單文件,簡單的可以作爲ANSI-C標準的JSON解析器。
  • QJson
   QJson是一個基於Qt的開發包用來將JSON數據解析成QVariant對象,JSON的數組將被映射爲QVariantList實例,而其他對象映射爲QVariantMap實例。

   關於Qt中對JSON的生成與解析,Qt5以前的版本,需要去進行單獨下載、編譯,才能使用。到了Qt5,提供了專門的QJsonDocument類來讀取和寫入JSON文檔。

Qt5中JSON的生成與解析
  • QJsonDocument
   QJsonDocument既可以從一個基於文本表示的UTF-8編碼,又可以從Qt自己的二進制格式讀取和寫入這個文件。
   JSON文檔可以從它的基於文本的表示使用QJsonDocument::fromJson()轉換爲QJsonDocument,用.toJSON()將其轉換回文字。解析器非常快速和高效,將JSON轉換爲二進制表示。
  • QJsonObject
   QJsonObject類用於封裝JSON對象。
   JSON對象是鍵值對,其中鍵是唯一的字符串,其值由QJsonValue代表。一個QJsonObject可以從QVariantMap轉換/被轉換。
  • QJsonArray
   QJsonArray類用於封裝JSON數組。
   一個JSON數組列表值。該列表可以通過從陣列插入和移除QJsonValue的操縱。一個QJsonArray可以從QVariantList轉換爲/被轉換。

  QJsonDocument有效解析後的文檔可以使用!iSNull()判斷。使用isArray()和isObject()來判斷是否包含一個數組或對象。文檔中包含的數組或對象可以使用array()或object()進行檢索,然後讀取或操縱。

示例
QJsonObject
(1)生成Json
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);

QJsonDocument document;
document.setObject(json);
QByteArray byte_array =document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

結果:
json_str:{"name": "Qt","version": 5,"windows": true}

(2)解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment =QJsonDocument::fromJson(byte_array,&json_error); 
if(json_error.error ==QJsonParseError::NoError) 
{  
   if(parse_doucment.isObject())  
   
       QJsonObject obj =parse_doucment.object(); 
       if(obj.contains("name")) 
       {  
   QJsonValue name_value =obj.take("name");
   if(name_value.isString())
    {
       QString name =name_value.toString();
    }
if(obj.contains("version"))  
{  
   QJsonValue version_value =obj.take("version");
   if(version_value.isDouble())
    {
int version = version_value.toVariant().toInt();
    }
if(obj.contains("windows"))
{
   QJsonValue version_value =obj.take("windows");
   if(version_value.isBool())
    {
bool flag = version_value.toBool();
   
}
   
}  

結果:
name:Qt
version:5
windows:true

QJsonArray
(1)生成Json
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);

QJsonDocument document;
document.setArray(json);
QByteArray byte_array =document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

結果:
json_str:["Qt","version",true]

(2)解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment =QJsonDocument::fromJson(byte_array,&json_error); 
if(json_error.error ==QJsonParseError::NoError) 
{  
   if(parse_doucment.isArray())  
   
QJsonArray array =parse_doucment.array(); 
int size = array.size();
for(int i=0; i
       {
   QJsonValue value =array.at(i);
   if(value.isString())
    {
QString name = value.toString();
    }
    elseif(value.isBool())
    {
bool flag = value.toBool();
    }
}
    }
}

結果:
數組不同下標對應的值
0:Qt
1:version
2:true

轉載:http://blog.sina.com.cn/s/blog_a6fb6cc90101gnxm.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章