Jsoncpp的使用

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming LanguageStandard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

值(value)可以是双引号括起来的字符串(string)、数值(number)、truefalse、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

空白可以加入到任何符号之间。 以下描述了完整的语言。

 

C++要使用JSON来解析数据,一般采用jsoncpp

网站:http://sourceforge.net/projects/jsoncpp/

下载了之后,解压,然后打开\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71

下的工程文件,进行编译链接就可以得到一个静态链接库json.lib

要用jsoncpp只需要将这个lib文件拷贝到你的工程目录下,并将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json

复制到工程目录下,然后将这些头文件加到工程中去就可以了。

例子:

{
"name" : "小楼一夜听春雨",
"age" : 27
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
int  main()
{
     ifstream ifs;
     ifs.open( "testjson.json" );
     assert (ifs.is_open());
 
     Json::Reader reader;
     Json::Value root;
     if  (!reader.parse(ifs, root,  false ))
     {
         return  -1;
     }
 
     std::string name = root[ "name" ].asString();
     int  age = root[ "age" ].asInt();
 
     std::cout<<name<<std::endl;
     std::cout<<age<<std::endl;
 
     return  0;
}

  

[{"name" : "xiaoy", "age" :17} , {"name" : "xiaot", "age" : 20}]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
int  main()
{
     ifstream ifs;
     ifs.open( "testjson.json" );
     assert (ifs.is_open());
 
     Json::Reader reader;
     Json::Value root;
     if  (!reader.parse(ifs, root,  false ))
     {
         return  -1;
     }
 
     std::string name;
     int  age;
     int  size = root.size();
     for  ( int  i=0; i<size; ++i)
     {
         name = root[i][ "name" ].asString();
         age = root[i][ "age" ].asInt();
 
         std::cout<<name<< " " <<age<<std::endl;
     }
 
     return  0;
}

  

json写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
 
int  main()
{
     Json::Value root;
     Json::FastWriter writer;
     Json::Value person;
 
     person[ "name" ] =  "hello world" ;
     person[ "age" ] = 100;
     root.append(person);
 
     std::string json_file = writer.write(root);
 
 
     ofstream ofs;
     ofs.open( "test1.json" );
     assert (ofs.is_open());
     ofs<<json_file;
 
     return  0;
}

结果:[{"age":100,"name":"hello world"}]

 

json对数组的解析还支持STL的风格。即

复制代码
Json::Value::Members member; // Members 这玩意就是vector<string>,typedef了而已
for  (Json::Value::iterator itr  =  objArray.begin(); itr  !=  objArray.end(); itr ++ )
{
member 
=  ( * itr).getMemberNames();
for  (Json::Value::Members::iterator iter  =  member.begin(); iter  !=  member.end(); iter ++ )
{
string  str_temp  =  ( * itr)[( * iter)].asString();
}
}
复制代码
内容概要:论文提出了一种基于空间调制的能量高效分子通信方案(SM-MC),将传输符号分为空间符号和浓度符号。空间符号通过激活单个发射纳米机器人的索引来传输信息,浓度符号则采用传统的浓度移位键控(CSK)调制。相比现有的MIMO分子通信方案,SM-MC避免了链路间干扰,降低了检测复杂度并提高了性能。论文分析了SM-MC及其特例SSK-MC的符号错误率(SER),并通过仿真验证了其性能优于传统的MIMO-MC和SISO-MC方案。此外,论文还探讨了分子通信领域的挑战、优势及相关研究工作,强调了空间维度作为新的信息自由度的重要性,并提出了未来的研究方向和技术挑战。 适合人群:具备一定通信理论基础,特别是对纳米通信和分子通信感兴趣的科研人员、研究生和工程师。 使用场景及目标:①理解分子通信中空间调制的工作原理及其优势;②掌握SM-MC系统的具体实现细节,包括发射、接收、检测算法及性能分析;③对比不同分子通信方案(如MIMO-MC、SISO-MC、SSK-MC)的性能差异;④探索分子通信在纳米网络中的应用前景。 其他说明:论文不仅提供了详细的理论分析和仿真验证,还给出了具体的代码实现,帮助读者更好地理解和复现实验结果。此外,论文还讨论了分子通信领域的标准化进展,以及未来可能的研究方向,如混合调制方案、自适应调制技术和纳米机器协作协议等。
### 如何使用 JsonCppJsonCpp 是一个功能强大的 C++ 库,用于解析和生成 JSON 数据。以下是关于如何使用该库的一些核心概念和示例。 #### 安装 JsonCpp 在 Linux 平台上安装 JsonCpp 的过程可以通过以下命令完成: ```bash mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=release -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=ON -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" .. make ``` 这组命令会构建静态和动态链接库文件以便后续项目中使用[^4]。 #### 创建简单的 JSON 对象 下面是一个创建简单 JSON 对象并将其转换为字符串的例子: ```cpp #include <iostream> #include <json/json.h> int main() { // 初始化根节点 Json::Value root; // 设置键值对 root["content"] = "Hello JsonCpp"; // 将 JSON 转换为字符串 Json::FastWriter fastWriter; std::string output = fastWriter.write(root); // 输出结果 std::cout << output << std::endl; return 0; } ``` 上述代码展示了如何通过 `Json::Value` 来定义 JSON 结构,并使用 `Json::FastWriter` 将其转成字符串形式[^1]。 #### 处理嵌套结构的 JSON 对于更复杂的 JSON 数据结构(如嵌套对象),可以按照层次关系依次设置子项。例如: ```cpp #include <iostream> #include <json/json.h> int main() { Json::Value root, score; // 添加基本字段 root["name"] = "xiaoming"; root["age"] = 28; // 构建嵌套的对象 score["math"] = 90; score["Chinese"] = 85; root["score"] = score; // 使用 FastWriter 进行序列化 Json::FastWriter writer; std::string jsonString = writer.write(root); // 打印最终结果 std::cout << jsonString << std::endl; return 0; } ``` 此程序片段演示了如何向 JSON 中添加多层数据以及处理复杂的数据类型[^3]。 #### JSON 反序列化 反序列化的目的是将 JSON 字符串转化为可操作的 `Json::Value` 对象。这里提供了一个基础示例来展示这一流程: ```cpp #include <iostream> #include <json/json.h> int main() { const char* jsonString = "{\"name\":\"xiaoming\", \"age\":18}"; // 解析输入的 JSON 字符串 Json::CharReaderBuilder builder; Json::Value obj; std::string errs; bool parsingSuccessful = parseFromStream(builder, std::istringstream(jsonString), &obj, &errs); if (!parsingSuccessful || !errs.empty()) { std::cerr << "Failed to parse JSON: " << errs << std::endl; return 1; } // 访问解析后的数据 std::cout << "Name: " << obj["name"].asString() << ", Age: " << obj["age"].asInt() << std::endl; return 0; } ``` 这段代码解释了如何读取 JSON 字符串并通过 `Json::CharReader` 实现解析的功能[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值