• JSONCPP介绍


    描述JSON串

    如何使用jsoncpp提供的数据结构来存储如下JSON串?

    // Configuration options
    {
        // Default encoding for text
        "encoding" : "UTF-8",
    
        // Plug-ins loaded at start-up
        "plug-ins" : [
            "python",
            "c++",  // trailing comment
            "ruby"
            ],
    
        // Tab indent size
        // (multi-line comment)
        "indent" : { /*embedded comment*/ "length" : 3, "use_space": true }
    }
    

    jsoncpp使用Json::Value对象来保存JSON串,Json::Value对象可以表示如下数据类型:

    枚举类型 说明 翻译
    nullValue 'null' value 不表示任何数据,空值
    intValue signed integer value 表示有符号整数
    uintValue unsigned integer value 表示无符号整数
    realValue double value 表示浮点数
    stringValue UTF-8 string value 表示utf8格式的字符串
    booleanValue bool value 表示布尔数
    arrayValue array value (ordered list) 表示数组,即JSON串中的[]
    objectValue object value (collection of name/value pairs) 表示键值对,即JSON串中的{}
    整个JSON串可以看做一个Json::ValueType::objectValue类型的Json::Value对象,我们将其命名为`root`,`root`包含了许多子Json::Value对象,例如:
    "encoding"是Json::ValueType::stringValue类型的Json::Value对象
    "plug-ins"是Json::ValueType::arrayValue类型的Json::Value对象
    "indent"是Json::ValueType::objectValue类型的Json::Value对象
    

    读取数据

    在知道如何描述JSON串后,我们来看下Json::Value类提供了哪些方法来访问保存的数据:

    // 检测保存的数据类型
    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;
    
    // 基础数据类型的访问
    const char* asCString() const;
    JSONCPP_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;
    
    // ValueType::arrayValue和ValueType::objectValue数据类型的访问,操作方式很类似C++的vector,可以使用数组风格或者迭代器风格来操作数据
    ArrayIndex size() const;
    Value& operator[](ArrayIndex index);
    Value& operator[](int index);
    const Value& operator[](ArrayIndex index) const;
    const Value& operator[](int index) const;
    Value get(ArrayIndex index, const Value& defaultValue) const;
    const_iterator begin() const;
    const_iterator end() const;
    iterator begin();
    iterator end();
    
    // ValueType::objectValue数据类型的访问,操作方式很类似C++的map
    Value& operator[](const char* key);
    const Value& operator[](const char* key) const;
    Value& operator[](const JSONCPP_STRING& key);
    const Value& operator[](const JSONCPP_STRING& key) const;
    Value& operator[](const StaticString& key);
    Value& operator[](const CppTL::ConstString& key);
    const Value& operator[](const CppTL::ConstString& key) const;
    Value get(const char* key, const Value& defaultValue) const;
    Value get(const char* begin, const char* end, const Value& defaultValue) const;
    Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
    Value get(const CppTL::ConstString& key, const Value& defaultValue) const;
    

    修改数据

    知道如何获取Json::Value对象或其子对象后,我们来看下如何修改Json::Value保存的数据:

    // 直接使用=赋值就可以了
    Value& operator=(Value other);
    
    // 因为Json::Value已经实现了各种数据类型的构造函数
    Value(ValueType type = nullValue);
    Value(Int value);
    Value(UInt value);
    Value(Int64 value);
    Value(UInt64 value);
    Value(double value);
    Value(const char* value);
    Value(const char* begin, const char* end);
    Value(const StaticString& value);
    Value(const JSONCPP_STRING& value);
    Value(const CppTL::ConstString& value);
    Value(bool value);
    Value(const Value& other);
    Value(Value&& other);
    

    解析JSON串

    前面了解了Json::Value是如何存储JSON串,但是如何解析JSON串并生成Json::Value对象呢?

    bool Json::Reader::parse(const std::string& document, // JSON串
        Value& root, // 这就时JSON串生成的Json::Value对象
        bool collectComments = true); // 允许在反序列化的时候保存注释,然后在序列化的时候写回注释
    
    bool Json::Reader::parse(const char* beginDoc, // 除了传入整个JSON串,还可以只指定其中的某一段进行解析
        const char* endDoc,
        Value& root,
        bool collectComments = true);
    
    bool Json::Reader::parse(JSONCPP_ISTREAM& is, // 当然还可以传入标准输入流,例如打开的文件
        Value& root,
        bool collectComments = true);
    

    生成JSON串

    现在我们知道怎么从JSON串中获取Json::Value对象,现在让我们来看下如何将一个Json::Value对象转换成JSON串:

    // 所有从Writer派生出来的类都可以直接将Json::Value对象转换成JSON字符串,可使用的类有:FastWriter、StyledWriter
    class JSON_API Writer {
    public:
        virtual ~Writer();
        virtual JSONCPP_STRING write(const Value& root) = 0;
    };
    
    // 所有从StreamWriter派生出来的类都可以直接将Json::Value对象转换成JSON字符串到输出流中,可使用的类有:BuiltStyledStreamWriter,但是这个类无法直接访问,只能通过StreamWriterBuilder::newStreamWriter方法直接获取类实例。注:如果只想获取字符串不想写到流里面就Writer派生的类
    class JSON_API StreamWriter {
    protected:
        JSONCPP_OSTREAM* sout_;  // not owned; will not delete
    public:
        StreamWriter();
        virtual ~StreamWriter();
        virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0;
    
        class JSON_API Factory {
        public:
            virtual ~Factory();
            virtual StreamWriter* newStreamWriter() const = 0;
        };  // Factory
    };  // StreamWriter
    
    // 所有从StyledStreamWriter派生出来的类都可以直接将Json::Value对象转换成JSON字符串到输出流中,感觉和BuiltStyledStreamWriter实现类似。注:如果只想获取字符串不想写到流里面就Writer派生的类
    class JSON_API StyledStreamWriter {
    public:
        StyledStreamWriter(JSONCPP_STRING indentation = "	");
        ~StyledStreamWriter() {}
    
        public:
            void write(JSONCPP_OSTREAM& out, const Value& root);
    }
    
  • 相关阅读:
    error和exception有什么区别?
    金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出?
    HTTP请求的GET与POST方式的区别
    解释一下什么是servlet?
    参数Parameters、变量Variables
    数据库事务的四大隔离级别以及处理的问题
    redis安装
    CVB生命周期(APIView源码解析)
    前端页面渲染机制
    Django基础之request
  • 原文地址:https://www.cnblogs.com/silvermagic/p/9087632.html
Copyright © 2020-2023  润新知