JSON详解
一、what is json
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,而Jsoncpp是个跨平台的开源库。
二、json的特性
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:\。
JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在方括号中)、对象(在花括号中)、null。对象在json中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构。数组在js中是中括号“[]”括起来的内容,数据结构为 [\java\。
三、JsonCpp的基本语法
使用JsonCpp前先来熟悉几个主要的类:
Json::Value 可以表示里所有的类型,比如int,string,object,array等,具体应用将会在后边示例中介绍。
Json::Reader 将json文件流或字符串解析到Json::Value, 主要函数有Parse。
Json::Writer 与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。 1、Value
Json::Value 是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。
可如下是用 Json::Value 类: Json::Value json_temp;
json_temp[\
json_temp[\
Json::Value root;
root[\
// 新建一个 Key(名为:key_string),赋予字符串值:\。 root[\
// 新建一个 Key(名为:key_number),赋予数值:12345。 root[\
// 新建一个 Key(名为:key_boolean),赋予bool值:false。 root[\
// 新建一个 Key(名为:key_double),赋予 double值:12.345。 root[\
// 新建一个 Key(名为:key_object),赋予json::Value 对象值。 root[\
// 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:\。
root[\
// 为数组 key_array 赋值,对第二个元素赋值为:1234。 Json::ValueType type = root.type(); // 获得 root 的类型,此处为 objectValue 类型。
2、Writer
如上说了 Json::Value 的使用方式,现在到了该查看刚才赋值内容的时候了,查看 json 内容,使用 Writer 类即可。
Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
顾名思义,用 Json::FastWriter 来处理 json 应该是最快的,下面我们来试试。 Json::FastWriter fast_writer;
std::cout << fast_writer.write(root) << std::endl; 输出结果为:
{\key_number\tring\
再次顾名思义,用 Json::StyledWriter 是格式化后的 json,下面我们来看看 Json::StyledWriter 是怎样格式化的。
Json::StyledWriter styled_writer;
std::cout << styled_writer.write(root) << std::endl; 输出结果为: {
\ \ \ \ \ \ \ },
\ }
3、Reader
Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的,下面我们来看个简单的例子。
Json::Reader reader; Json::Value json_object;
const char* json_document = \ if (!reader.parse(json_document, json_object)) return 0;
std::cout << json_object[\ std::cout << json_object[\ 输出结果为:
\
四、JsonCpp的库文件分析
Value json结构体
Value类,json存放对象的结构体。它把所有的类型都集合在自己内部,而不再是union 。如果是普通的类型,如int、boot就直接赋值,给与变量类型。如果是字符串就使用duplicateStringValue新建字符串。如果是结构体、类,就使用new或者alloc*进行分配。
Value::Value( ValueType type )需要指定类型 switch ( type )… {
case uintValue:
value_.int_ = 0; …
}//通过标识表明是什么类型value。
value还能接受不同类型的变量的初始化: Value::Value( UInt value ) Value::Value( Int value ) Value::Value( Int64 value ) Value::Value( UInt64 value ) Value::Value( double value ) Value::Value( const char *value )
Value::Value( const char *beginValue, const char *endValue ) //字符串 Value::Value( const std::string &value ) Value::Value( const StaticString &value )
Value::Value( const CppTL::ConstString &value ) Value::Value( bool value )
Value::Value( const Value &other )通过类型type_来进行判断类型初始化
Value::operator[]操作符: ArrayIndex index类型:
如果没有定义使用自定义类型结构(默认使用map),则通过index找到名字CZString,然后在map里面寻找,如果有就返回,没有就新建一个。 如果是定义了,arrayValue类型,直接调用value_.array_->resolveReference( index );
Int index类型:
将index 转换成ArrayIndex(index),然后再次调用[]操作 。
const Value &
相关推荐: