Json庫源碼解析

自己項目中的Json庫源碼

先從使用方式開始:
image.png

Json::Value _json;
調(diào)用Value類的構(gòu)造函數(shù)

image.png

跳轉(zhuǎn)到里面 可以看到 Value類的主要成員是這些

再看構(gòu)造函數(shù):


image.png

從傳遞參數(shù)可以得知:最開始的初始化代碼應(yīng)該是調(diào)用的 Value( ValueType type = nullValue );這個構(gòu)造函數(shù),接下來轉(zhuǎn)進去看看具體邏輯:

Value::Value( ValueType type )
   : type_( type )
   , allocated_( 0 )
   , comments_( 0 )
# ifdef JSON_VALUE_USE_INTERNAL_MAP
   , itemIsUsed_( 0 )
#endif
{
   switch ( type )
   {
   case nullValue:
      break;
   case intValue:
   case uintValue:
      value_.int_ = 0;
      break;
   case realValue:
      value_.real_ = 0.0;
      break;
   case stringValue:
      value_.string_ = 0;
      break;
#ifndef JSON_VALUE_USE_INTERNAL_MAP
   case arrayValue:
   case objectValue:
      value_.map_ = new ObjectValues();
      break;
#else
   case arrayValue:
      value_.array_ = arrayAllocator()->newArray();
      break;
   case objectValue:
      value_.map_ = mapAllocator()->newMap();
      break;
#endif
   case booleanValue:
      value_.bool_ = false;
      break;
   default:
      JSON_ASSERT_UNREACHABLE;
   }
}

上面代碼主要是通過傳遞的valueType來確定如何進行初始化,如果是空的話 那么默認就break掉

這里展開說一下

 case objectValue:
      value_.map_ = new ObjectValues();
      break;

當時objectValue 的時當前的value_.map_對象進行了初始化铭乾,看看ObjectValues()干了什么


image.png

可以看到實際上就是new了一個map辆飘,key是CZString缓熟,Value是Value類型
再看看CZString又是啥:


image.png

可以看到這個類的成員主要是一個 char *cstr_ 以及一個index_;

接下來是使用Json::Value類

常見用法:


image.png

訪問這個json對象的某個Key對應(yīng)的Json

image.png

可以看到Value類重載了[]這個運算符诫睬,參數(shù)傳的是char*類型 和 string類型都有

首先看第一個函數(shù)

Value &
Value::operator[]( const char *key )
{
   return resolveReference( key, false );
}
Value &
Value::resolveReference( const char *key, 
                         bool isStatic )
{
   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );  //只允許nullValue和objectValue類型
   if ( type_ == nullValue )
      *this = Value( objectValue ); //調(diào)用構(gòu)造函數(shù) Value(objectValue); 實際上就是new 了個map 
#ifndef JSON_VALUE_USE_INTERNAL_MAP
   CZString actualKey( key, isStatic ? CZString::noDuplication 
                                     : CZString::duplicateOnCopy ); //調(diào)用了CZString的構(gòu)造函數(shù),生成一個名為actualKey的對象
   ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
   if ( it != value_.map_->end()  &&  (*it).first == actualKey )
      return (*it).second;

   ObjectValues::value_type defaultValue( actualKey, null );
   it = value_.map_->insert( it, defaultValue );
   Value &value = (*it).second;
   return value;
#else
   return value_.map_->resolveReference( key, isStatic );
#endif
}
image.png

CZString的構(gòu)造函數(shù)代碼如下

這個函數(shù)做的就是把傳來的cstr賦值到cstr_上狡恬,并且把allocate分配方式記錄在index_上微宝。
上面static = false 棺亭,對應(yīng)的allocate =duplicateOnCopy ==2;

接下來就是通關(guān)lower_bound函數(shù)找到這個key對應(yīng)的value
如果沒找到就生成一個defaultValue 并且返回。

一些常用的函數(shù)解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟋软,一起剝皮案震驚了整個濱河市镶摘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岳守,老刑警劉巖凄敢,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湿痢,居然都是意外死亡涝缝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門譬重,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒逮,“玉大人,你說我怎么就攤上這事臀规∠校” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵以现,是天一觀的道長狠怨。 經(jīng)常有香客問我,道長邑遏,這世上最難降的妖魔是什么佣赖? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮记盒,結(jié)果婚禮上憎蛤,老公的妹妹穿的比我還像新娘。我一直安慰自己纪吮,他們只是感情好俩檬,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碾盟,像睡著了一般棚辽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰肴,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天屈藐,我揣著相機與錄音,去河邊找鬼熙尉。 笑死联逻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的检痰。 我是一名探鬼主播包归,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铅歼!你這毒婦竟也來了公壤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤谭贪,失蹤者是張志新(化名)和其女友劉穎境钟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俭识,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡慨削,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了套媚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缚态。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤瘤,靈堂內(nèi)的尸體忽然破棺而出玫芦,到底是詐尸還是另有隱情,我是刑警寧澤本辐,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布桥帆,位于F島的核電站医增,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏老虫。R本人自食惡果不足惜叶骨,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祈匙。 院中可真熱鬧忽刽,春花似錦、人聲如沸夺欲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽些阅。三九已至伞剑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扑眉,已是汗流浹背纸泄。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腰素,地道東北人聘裁。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像弓千,于是被迫代替她去往敵國和親衡便。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容