JSON详解
一、what is json
JSON(JavaScript Object Notation)xml一样也是一种数据交换格式,而Jsoncpp是个跨平台的开源库。
二、json的特性
JSON 数据的书写格式是:名称/值对。
js获取json的key和value
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:"firstName":"John"
JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true false)、数组(在方括号中)、对象(在花括号中)、null对象在json中表示为{}括起来的内容,数据结构为 {keyvalue,keyvalue,...}的键值对的结构。数组在js中是中括号[]”括起来的内容,数据结构为 ["java","javascript","vb",...]
三、JsonCpp的基本语法
使用JsonCpp前先来熟悉几个主要的类: 
Json::Value    可以表示里所有的类型,比如int,string,object,array等,具体应用将会在后边示例中介绍。
Json::Reader  json文件流或字符串解析到Json::Value, 主要函数有Parse
Json::Writer    Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriterJson::StyleWriter,分别输出不带格式的json和带格式的json
1Value
    Json::Value jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。
可如下是用 Json::Value 类:
Json::Value json_temp;   
json_temp["name"] = Json::Value("huchao");
json_temp["age"] = Json::Value(26);
 
Json::Value root; 
root["key_string"] = Json::Value("value_string");     
 // 新建一个 Key(名为:key_string),赋予字符串值:"value_string"
root["key_number"] = Json::Value(12345);         
  // 新建一个 Key(名为:key_number),赋予数值:12345
root["key_boolean"] = Json::Value(false);             
 // 新建一个 Key(名为:key_boolean),赋予bool值:false
root["key_double"] = Json::Value(12.345);         
  // 新建一个 Key(名为:key_double),赋予 double值:12.345
root["key_object"] = Json_temp;                         
 // 新建一个 Key(名为:key_object),赋予json::Value 对象值。
root["key_array"].append("array_string");             
// 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:"array_string"
root["key_array"].append(1234);                         
 // 为数组 key_array 赋值,对第二个元素赋值为:1234
Json::ValueType type = pe();                     
 // 获得 root 的类型,此处为 objectValue 类型。
 
2Writer
如上说了 Json::Value 的使用方式,现在到了该查看刚才赋值内容的时候了,查看 json 内容,使用 Writer 类即可。
Jsoncpp  Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriterJson::StyledWriterJson::StyledStreamWriter
顾名思义,用 Json::FastWriter 来处理 json 应该是最快的,下面我们来试试。
Json::FastWriter fast_writer;
std::cout << fast_writer.write(root) << std::endl;
输出结果为:
{"key_array":["array_string",1234],"key_boolean":false,"key_double":12.3450,"key_number":12345,"key_object":{"age":26,"name":"huchao"},"key_string":"value_string"}
 
再次顾名思义,用 Json::StyledWriter 是格式化后的 json,下面我们来看看 Json::StyledWriter 是怎样格式化的。
Json::StyledWriter styled_writer;
std::cout << styled_writer.write(root) << std::endl;
输出结果为:
{
   "key_array" : [ "array_string", 1234 ],
   "key_boolean" : false,
   "key_double" : 12.3450,
   "key_number" : 12345,
   "key_object" : {
      "age" : 26,
      "name" : "huchao"
   },
   "key_string" : "value_string"
}
 
3Reader
    Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的,下面我们来看个简单的例子。
  Json::Reader reader;
  Json::Value json_object;
  const char* json_document = "{/"age/" : 26,/"name/" : /"huchao/"}";
  if (!reader.parse(json_document, json_object))
    return 0;
  std::cout << json_object["name"] << std::endl;
  std::cout << json_object["age"] << std::endl;
输出结果为:
"huchao"
四、JsonCpp的库文件分析
Value    json结构体
Value类,json存放对象的结构体。它把所有的类型都集合在自己内部,而不再是union 。如果是普通的类型,如intboot就直接赋值,给与变量类型。如果是字符串就使用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 &
Value::operator[]( ArrayIndex index ) const
inde转换成keyCZString),调用对应结构的find函数
const Value &
Value::operator[]( const char *key ) const
调用对应结构的find函数
字符串类型
返回索引的字符
函数:
Value::as*类型函数,通过类型标志type_返回相对应的成员变量。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。