object Value
Json::Value person;
person["name"] = "tocy";
Value类里有 Value( const char *value );构造函数
Value &operator=( const Value &other );
所以"tocy"自动转换为一个Value;接下来讲讲Value( const char *value );构造函数里面发生了什么。
Value::Value( const char *value )
: type_( stringValue )
, allocated_( true )
, comments_( 0 )
{
value_.string_ = valueAllocator()->duplicateStringValue( value );
}
其实上面的操作就是将tocy字符串深拷贝到value_.string中。value这个类成员变量的类型如下:
union ValueHolder
{
Int int_;
UInt uint_;
double real_;
bool bool_;
char *string_;
# ifdef JSON_VALUE_USE_INTERNAL_MAP
ValueInternalArray *array_;
ValueInternalMap *map_;
#else
ObjectValues *map_;
# endif
} value_;
valueAllocator()单例模式获取一个ValueAllocator *,DefaultValueAllocator 的父类是ValueAllocator
static ValueAllocator *&valueAllocator()
{
static DefaultValueAllocator defaultAllocator;
static ValueAllocator *valueAllocator = &defaultAllocator;
return valueAllocator;
}
duplicateStringValue()深拷贝字符串。
virtual char *duplicateStringValue( const char *value,
unsigned int length = unknown )
{
//@todo invesgate this old optimization
//if ( !value || value[0] == 0 )
// return 0;
if ( length == unknown )
length = (unsigned int)strlen(value);
char *newString = static_cast<char *>( malloc( length + 1 ) );
memcpy( newString, value, length );
newString[length] = 0;
return newString;
}
virtual void releaseStringValue( char *value )
{
if ( value )
free( value );
}
Value &Value::resolveReference( const char *key, bool isStatic )
{
JSON_ASSERT( type_ == nullValue || type_ == objectValue );
if ( type_ == nullValue )
*this = Value( objectValue );
CZString actualKey( key, isStatic ? CZString::noDuplication
: CZString::duplicateOnCopy );
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;
}
type_必须是nullValue或objectValue ,根据Json语法规则,当然是这样的。其实只有objectValue 类型的Value才有资格[](对,就是这个符号),若是<
解析JSON::Value类实现

最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



