使用jsoncpp时主要使用到的类有 Json::Value和 Json::Reader;
const char* asCString() const;
String asString() const;
Int asInt() const;
UInt asUInt() const;
Int64 asInt64() const;
UInt64 asUInt64() const;
LargestInt asLargestInt() const;
LargestUInt asLargestUInt() const;
float asFloat() const;
double asDouble() const;
bool asBool() const;
bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isInt64() const;
bool isUInt() const;
bool isUInt64() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;
//获取对应字段内容
Value get(const char* key, const Value& defaultValue) const;
//重载了[], 所以可以使用root["name"],root[0]类似操作;
const Value& operator[](int index) const;
Value& operator[](const char* key);
//上面接口本质都调用了find
Value const* find(char const* begin, char const* end) const;
其中成员变量 value_ 保存了Json::Value中实际存储的内容; 采用了联合体;
union ValueHolder {
LargestInt int_;
LargestUInt uint_;
double real_;
bool bool_;
char* string_; // if allocated_, ptr to { unsigned, char[] }.
ObjectValues* map_;
} value_;
其中的 ObjectValues* map_; 成员能够存储 objectValue或arrayValue 值;
定义: typedef std::map
采用了std::map 存储 {"字段",内容};
举例说明:
{
"name":"zhangsan", //存储为 char *string_ ;
"age":18, //存储为 LargestInt int_;
"score":{ //存储为 ObjectValues* map_;
"math":"prefect",
"english":90
}
}
bool parse(const std::string& document, Value& root,
bool collectComments = true);
using Nodes = std::stack;
Nodes nodes_;
存储Json::Value变量指针的栈;
Value& OurReader::currentValue() { return *(nodes_.top()); }
其作用是获取栈顶指针;
该类中主要用到的就是parse()函数; 其内部通过循环查找 "Token" 类型(如'{','}','[',']','"','数字','bool类型'等) 去匹配 readObject,readArray,decodeNumber,decodeString等,通过如下:
currentValue().swapPayload(v);
currentValue().setOffsetStart(token.start_ - begin_);
currentValue().setOffsetLimit(token.end_ - begin_);
类型操作将内容增加到 parse()函数的root变量中; 其中涉及到nodes_入栈出栈操作,栈指针调整操作等; 具体细节怎么把解析的内容和root中的map联系到一起的?值得探索!!!