描述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);
}