描述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 = "\t");
~StyledStreamWriter() {} public:
void write(JSONCPP_OSTREAM& out, const Value& root);
}

JSONCPP介绍的更多相关文章

  1. C++ Jsoncpp源代码编译与解析Json

    1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的cl ...

  2. 介绍一个非常好用的跨平台C++开源框架:openFrameworks

    介绍一个非常好用的跨平台C++开源框架:openFrameworks 简介 首先需要说明的一点是: openFrameworks 设计的初衷不是为计算机专业人士准备的, 而是为艺术专业人士准备的, 就 ...

  3. JsonCpp简单使用

    作者:ilife JsonCpp简单使用 1.相关概念总结 (1)解析json的方法 Json::Value json;     //表示一个json格式的对象 Json::Reader reader ...

  4. C++解析JSON之JsonCPP

    一.JSON简介 JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读.编写.解析. JSON由两种基本结构构成: )"名称/值" ...

  5. JSON数据解析——jsoncpp的使用

    版权所有,转载请注明:http://blog.sina.com.cn/u/1978765352 由于工作中需要用到JSON数据,所以解析JSON数据就成了一个非常重要的工作内容. 其实用C++解析数据 ...

  6. C++的Json解析库:jsoncpp和boost

    C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...

  7. c++ - Create empty json array with jsoncpp - Stack Overflow

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     multiprocessing.pool c++ - Create empty json array wit ...

  8. json简介及JsonCpp用法

    [时间:2017-04] [状态:Open] [关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource] json简介 本文仅仅是添加我个人对json格式的理解,更 ...

  9. C++通过jsoncpp类库读写JSON文件-json用法详解

    介绍: JSON 是常用的数据的一种格式,各个语言或多或少都会用的JSON格式. JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择. ...

随机推荐

  1. UOJ130 【NOI2015】荷马史诗

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. Angular-ui-router路由,View管理

    ui-router的工作原理非常类似于Angular的路由控制,他只关注状态. Angular模板 最简单的模板,例如main.html: <body data-ng-app="myA ...

  3. SQL2005 2008配置错误,无法识别的配置节 system.serviceModel machine.config配置文件有问题

    当装上2008的时候,你以前的程序突然报出你的machine.config配置文件有问题,比如 “/” 应用程序中的服务器错误. 配置错误 说明 : 在处理向该请求提供服务所需的配置文件时出错.请检查 ...

  4. window操作常识

  5. 如何在node.js中使用neo4j

    本章中你将会学到如何在node.js中使用neo4j图形数据库. 当你想存储或者查询和数据紧密关联的数据的时候,图形数据库很有用. neo4j是一个可有效存储,处理和查询你数据模型中紧密相连的元素的数 ...

  6. 10 Python 数据类型—集合

    在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...

  7. kylin_学习_01_kylin安装部署

    一.环境准备 根据官方文档,kylin是需要运行在hadoop环境下的,如下图: 1.hadoop环境搭建 参考:hadoop_学习_02_Hadoop环境搭建(单机) 2.hbase环境搭建 参考: ...

  8. 7_DoubleBuffer 游戏编程中的双缓存模式

    ### double buffer 双缓存 简单说: 当一个缓存被读取的时候,往另一个缓存里写入, 如此交替 #### the pattern 有两个缓存实例,一个是 current buffer, ...

  9. Winform开发入门集中培训系列文章

    最近有个培训,写PPT不如写博客了,共享是程序猿的职业情操吧,因此,本人准备写一个Winform开发的系列文章,对于初级开发者来说,应该比较有用,写作当中不免错误或不成熟的地方,看到的朋友请留言指出, ...

  10. git克隆某一个branch

    git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字