自己項目中的Json庫源碼
先從使用方式開始:
Json::Value _json;
調(diào)用Value類的構(gòu)造函數(shù)
跳轉(zhuǎn)到里面 可以看到 Value類的主要成員是這些
再看構(gòu)造函數(shù):
從傳遞參數(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()干了什么
可以看到實際上就是new了一個map辆飘,key是CZString缓熟,Value是Value類型
再看看CZString又是啥:
可以看到這個類的成員主要是一個 char *cstr_ 以及一個index_;
接下來是使用Json::Value類
常見用法:
訪問這個json對象的某個Key對應(yīng)的Json
可以看到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
}
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 并且返回。