Json和JsonCpp是什么这里就不多余介绍了,大概知道就行,各位想详细了解的话可以自行搜索。
     
    
   
    
    
    1.JsonCpp库下载
   
JsonCpp的代码在github上开源,可以前往github下载源代码加入到项目中使用。
也可以编译为静态/动态库使用。
    源码地址:
    
     https://github.com/open-source-parsers/jsoncpp
    
   
访问不了的话可以自行百度下载。
    
    
    2.JsonCpp使用
   
    
    
    1.常用类介绍
   
    
    
    1.
    
     Json::Value
    
   
    
     按照字面字面意思理解,就是JsonCpp里定义的一种值
     
     值的类型有以下几种:
     
    
   
enum ValueType
   {
      nullValue = 0, ///< 'null' value
      intValue,      ///< signed integer value
      uintValue,     ///< unsigned integer value
      realValue,     ///< double value
      stringValue,   ///< UTF-8 string value
      booleanValue,  ///< bool value
      arrayValue,    ///< array value (ordered list)
      objectValue    ///< object value (collection of name/value pairs).
   };
Tips 1. 对象类型的value由一到多个键值对组成,每个键值对的值可以是任意类型。
Tips 2. 数组中的项也可以是任意类型,可以任意混搭。
Tips 3. 多个键值对 或 多个数组的项 之间用逗号‘,’隔开,最后一个键值对(数组的项)后不要加逗号。
Tips 4. json文件可以用vs code一键格式化,方便实用。有红波浪线的地方就是有错误,会parse失败。
    
     值对象的类型可以通过
     
      type()
     
     方法获取。
     
     
      value.type();
     
    
   
     
     
     2.
     
      Json::Reader
     
    
     
      Json解释器,可以使用
      
       parse()
      
      方法将Json格式的字符串解析成Json::Value
     
    
	string str;		// Json格式的字符串
	Json::Value value;
	Json::Reader reader;
	if (!reader.parse(str, value)) {
		// 解析失败
	}
      
      
      3.
      
       Json::FastWriter
      
      和
      
       Json::StyleWriter
      
     
      
       可以将Json::Value转换为字符串。其中FastWriter结果是无格式的字符串。而StyleWriter是格式化的字符串。
      
     
    string str;
    Json::Value value;
    value["exp"] = "JsonCpp使用示例";
    Json::FastWriter fwriter;
    str = fwriter.write(value);     // str = "{"exp":"JsonCpp使用示例"}\n"
    Json::StyledWriter swriter;
    str = swriter.write(value);     // str = "{\n   \"exp\" : \"JsonCpp使用示例\"\n}\n";
       
        其中转换为格式化字符串也可以使用Json::Value的
        
         toStyleString()
        
        方法。
        
        
         str = value.toStyledString();
        
       
      
        
        
        2.常用函数介绍
       
        
        
        1.
        
         
          Value &operator[]( UInt index );
         
        
       
Value &operator[]( UInt index );
        
         const Value &operator[]( UInt index ) const;
        
        
        
         Value &operator[]( const char *key );
        
        
        
         const Value &operator[]( const char *key ) const;
        
        
        
         Value &operator[]( const std::string &key );
        
        
        
         const Value &operator[]( const std::string &key ) const;
        
        
        
         Value &operator[]( const StaticString &key );
        
        
        
         [] 里可以传入 char * 或 string 等其他字符串作为 key 取得对应的值。也可以传入非负整数作为索引取得值。
        
       
但是需要注意的是,只有当value的类型是 nullValue 或 objectValue 时才可以传入字符串调用 [] 操作符,否则会触发assert错误中断。
当 value 类型为 nullValue 或 arrayValue 时才可以传入uint作为索引调用 [] 操作符。
         
         
         2.
         
          
           bool isNull() const;
          
         
        
bool isNull() const;
         
          判断type()是否为nullValue,是则返回true,否则返回false。
          
          效果等同于
          
           bool operator!() const;
          
          操作符。
         
        
          
           bool ret = value["null"].isNull();
          
          
          
           str = value.toStyledString();
          
          
           但是这样使用会先调用重载的 [] 符号,如果传入的 key 值不存在,就会创建一个新的空键值对。
          
         
           
           
           3.
           
            
             Members getMemberNames() const;
            
           
          
Members getMemberNames() const;
           
            获取Json::Value的键列表,本质是字符串向量。
           
          
            
             typedef std::vector<std::string> Json::Value::Members;
            
Tips: 当value的类型是
objectValue
或
nullValue
时才可以使用此函数,否则会报运行时错误。因此,收到value时一定要先判断类型处理,不要一上来就getMemberNames()。
            
             Json::Value::Members mem = value.getMemberNames();
            
            
            
            4.
            
             
              UInt size() const;
             
            
           
UInt size() const;
            
             如果类型是数组或对象,则返回数组或对象的大小;其他类型返回0。
            
           
             
             
             5.
             
              
               bool empty() const;
              
             
            
bool empty() const;
             
              如果是数组或对象类型,size()为0则返回true;
              
              如果是nullValue类型,返回true;
              
              剩下类型返回false。
             
            
              
              
              6.
              
               
                bool isMember( const char *key ) const;
               
              
             
bool isMember( const char *key ) const;
              
               bool isMember( const std::string &key ) const;
              
              
               判断 value 是否包含传入的字符串作为 key 的键值对。
               
               包含则返回 true
               
               不包含则返回 false
              
             
               
               
               7.
               
                
                 Value removeMember( const char* key );
                
               
              
Value removeMember( const char* key );
               
                移除字符串作为 key 的键值对。
                
                返回被移除的键值对的值。
                
                不存在该键值对则返回null。
               
              
仅当 value 的类型是 nullValue 或 objectValue 时可调用此函数,否则会assert错误触发中断。
                
                
                8.
                
                 
                  Value &append( const Value &value );
                 
                
               
Value &append( const Value &value );
                
                 添加value到数组的结尾
                
               
仅当 value 的类型为 nullValue 或 arrayValue 时才可调用此函数,否则会assert错误触发中断。
                 
                 
                 3. 遍历Json::Value
                
遍历方法如下:
                 入口处先判断一下类型
                 
                  value.type() == Json::objectValue ? objectValue(value) : typeSwitch(value);
                 
void objectValue(Json::Value &value)
{
    Json::Value::Members mem = value.getMemberNames();
    for (auto iter = mem.begin(); iter != mem.end(); iter++) {
        printf("%s : ", (*iter).c_str());       // 打印键名
        typeSwitch(value[*iter]);
    }
}
void typeSwitch(Json::Value &value)
{
    switch (value.type())
    {
        case Json::objectValue :
            objectValue(value);
            break;
        case Json::arrayValue :
        {
            auto count = value.size();
            for (unsigned int i = 0; i < count; i++)
                typeSwitch(value[i]);
        }
            break;
        case Json::stringValue :
            printf("%s\n", value.asString().c_str());
            break;
        case Json::realValue :
            printf("%lf\n", value.asDouble());
            break;
        case Json::uintValue :
            printf("%u\n", value.asUInt());
            break;
        case Json::intValue :
            printf("%d\n", value.asInt());
            break;
        case Json::booleanValue :
            printf("%d\n", value.asBool());
            break;
        default :
            break;
    }
}
                 如过想要根据 key 值寻找特定键值对的话,可以修改一下
                 
                  objectValue()
                 
                 ,然后递归调用。
                
                 
                 
                 3.总结
                
JsonCpp中提供的方法非常丰富全面,源码也对新人比较友好,可以多加阅读。
以上仅是我个人学习总结,欢迎各位一起探讨补充
               
              
             
            
           
          
         
        
       
      
     
    
   
  
 
