java multimap 序列化_C++ JSON库的使用

1. 如何使用?

2. 常用方法

2.1 创建json对象

2.1.1 使用cin,cout输入输出流

2.1.2 提供根据键直接生成键值对的方法

2.1.3 json::array json::object

2.1.4 几个区别

2.2 序列化

2.2.1 标准输出自动序列化

2.2.2 使用dump()函数

2.3 反序列化

2.3.1 从标准输入反序列化

2.3.2 通过附加_json到字符串文字来创建对象实现反序列化

2.3.3 使用json::parse()函数

2.3.4 从迭代器范围读取

2.3 与STL适应

2.4 STl与json转换

2.5 json最重要的还是设计config文件

最后

JSON(Java Object Notation) 是一种轻量级的数据交换格式。它基于ECMA的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、Java、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

今天介绍的json版本是在c++下使用的,是一个开源项目。

GitHub开源项的地址:https://github.com/nlohmann/json

json for modern c++是一个德国大牛nlohmann写的,该版本的json有以下特点:

1.直观的语法。

2.整个代码由一个头文件组成json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。

3.使用c++11标准编写。

4.使用json 像使用STL容器一样。

5.STL和json容器之间可以相互转换。

1. 如何使用?

将github上的src文件夹里的json.hpp头文件下载保存到当前目录中。

在代码中包含json.hpp头文件并引入json作用域

#include "json.hpp"

using json = nlohmann::json;

1

2

2. 常用方法

2.1 创建json对象

2.1.1 使用cin,cout输入输出流

json提供了cin,cout的输入输出流的操作符。但需要注意的是,cin要有ctr + D结束输入。cout会自动把json转换为string。

#include

#include "json.hpp"

using json = nlohmann::json;

using std::cout;

using std::endl;

using std::cin;

int main(int argc, const char * argv[]) {

json temp;

cin >> temp;

cout << temp << endl;

return 0;

}

/*

输入:

{

"pi": 3.141,

"happy": true,

"name": "Niels",

"nothing": null,

"answer": {

"everything": 42

},

"list": [1, 0, 2],

"object": {

"currency": "USD",

"value": 42.99

}

}

{"answer":{"everything":42},"happy":true,"list":[1,0,2],"name":"Niels","nothing":null,"object":{"currency":"USD","value":42.99},"pi":3.141}

Program ended with exit code: 0

*/

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

2.1.2 提供根据键直接生成键值对的方法

#include

#include "json.hpp"

using json = nlohmann::json;

using std::cout;

using std::endl;

using std::cin;

int main(int argc, const char * argv[]) {

// create an empty structure (null)

json j;

// add a number that is stored as double (note the implicit conversion of j to an object)

j["pi"] = 3.141;

// add a Boolean that is stored as bool

j["happy"] = true;

// add a string that is stored as std::string

j["name"] = "Niels";

// add another null object by passing nullptr

j["nothing"] = nullptr;

// add an object inside the object

j["answer"]["everything"] = 42;

// add an array that is stored as std::vector (using an initializer list)

j["list"] = { 1, 0, 2 };

// add another object (using an initializer list of pairs)

j["object"] = { {"currency", "USD"}, {"value", 42.99} };

// instead, you could also write (which looks very similar to the JSON above)

json j2 = {

{"pi", 3.141},

{"happy", true},

{"name", "Niels"},

{"nothing", nullptr},

{"answer", {

{"everything", 42}

}},

{"list", {1, 0, 2}},

{"object", {

{"currency", "USD"},

{"value", 42.99}

}}

};

cout << j << endl;

cout << endl;

cout << j2 << endl;

return 0;

}

/*

{"answer":{"everything":42},"happy":true,"list":[1,0,2],"name":"Niels","nothing":null,"object":{"currency":"USD","value":42.99},"pi":3.141}

{"answer":{"everything":42},"happy":true,"list":[1,0,2],"name":"Niels","nothing":null,"object":{"currency":"USD","value":42.99},"pi":3.141}

Program ended with exit code: 0

*/

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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

2.1.3 json::array json::object

在所有上述情况下,你不需要“告诉”编译器要使用哪个JSON值。如果你想明确或表达一些边缘的情况下,可以使用json::array,json::object。

#include

#include "json.hpp"

using json = nlohmann::json;

using std::cout;

using std::endl;

using std::cin;

int main(int argc, const char * argv[]) {

// a way to express the empty array []

json empty_array_explicit = json::array();

// ways to express the empty object {}

json empty_object_implicit = json({});

json empty_object_explicit = json::object();

// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]

json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) };

for (auto object : array_not_object) {

cout << object << endl;

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

2.1.4 几个区别

array是一个数组,可以用数字直接下标访问。

json array = {

"yan",12,"ze",13

};

cout << array[0] << endl;

1

2

3

4

array是一个数组里面放了一个数组。认为”yan”,12是数组里面的两个元素。

json array = {

{"yan",12},

"ze",13

};

cout << array[0][0] << endl;

1

2

3

4

5

array是数组里面有一个数组(里面包含了一个键值对)。

json array = {

{{"yan",12}},

"ze",13

};

cout << array[0]["yan"] << endl;

1

2

3

4

5

array里面含有两个键值对。

json array = {

{"yan",12},

{"ze",13}

};

cout << array["yan"] << endl;

1

2

3

4

5

array里面含有两个数组,数组里面分别有一个键值对。

json array = {

{

{"yan",12}

},

{

{"ze",13}

}

};

cout << array[0]["yan"] << endl;

1

2

3

4

5

6

7

8

9

(注意区分{}的位置来判断对象的性质)。

如果实在判断不出来,可以用C++11的for语句,看每一个输出结果的符号来判断每一个对象的性质。

2.2 序列化

将json对象序列化,成为字符串

2.2.1 标准输出自动序列化

json j

std :: cout << j;

// setw操纵器被重载以设置漂亮打印的缩进

std :: cout << std :: setw( 4)<< j << std :: endl;

1

2

3

4

2.2.2 使用dump()函数

//显式转换为string

std::string s = j.dump(); // {\"happy\":true,\"pi\":3.141}

//序列化与漂亮的打印

//传入空格的数量缩进

std::cout << j.dump(4) << std::endl;

// 输出:

//{

// "happy": true,

// "pi": 3.141

// }

1

2

3

4

5

6

7

8

9

10

11

2.3 反序列化

将数据流转化为json对象

2.3.1 从标准输入反序列化

json j

std :: cin >> j;

1

2

2.3.2 通过附加_json到字符串文字来创建对象实现反序列化

//从字符串文字创建对象

json j = " { \" happy \":true,\" pi \":3.141} " _json;

//或者原始字符串文字

auto j2 = R"(

{

"happy":true,

"pi":3.141

}

)" _json;

1

2

3

4

5

6

7

8

9

10

请注意,没有附加_json后缀,传递的字符串文字不会被解析,而只是用作JSON字符串值。也就是说,json j = "{ “happy”: true, “pi”: 3.141 }“只存储字符串”{ “happy”: true, “pi”: 3.141 }"而不是解析实际的对象。

2.3.3 使用json::parse()函数

//明确解析

auto j3 = json::parse(" { \" happy \":true,\" pi \":3.141} ");

1

2

2.3.4 从迭代器范围读取

您还可以从迭代器范围读取JSON; 也就是说,可以从其内容存储为连续字节序列的迭代器访问的任何容器,例如std::vector

std :: vector < uint8_t > v = { ' t ',' r ',' u ',' e ' };

json j = json :: parse(v.begin(),v.end());

//或

std :: vector < uint8_t > v = { ' t ',' r ',' u ',' e ' };

json j = json :: parse(v);

1

2

3

4

5

6

2.3 与STL适应

json提供了许多和STL类似的操作方法:

#include

#include "json.hpp"

using json = nlohmann::json;

using std::cout;

using std::endl;

using std::cin;

int main(int argc, const char * argv[]) {

// create an array using push_back

json j;

j.push_back("foo");

j.push_back(1);

j.push_back(true);

// iterate the array

for (json::iterator it = j.begin(); it != j.end(); ++it) {

std::cout << *it << '\n';

}

// range-based for

for (auto element : j) {

std::cout << element << '\n';

}

// getter/setter

const std::string tmp = j[0];

j[1] = 42;

bool foo = j.at(2);

// other stuff

j.size(); // 3 entries

j.empty(); // false

j.type(); // json::value_t::array

j.clear(); // the array is empty again

// convenience type checkers

j.is_null();

j.is_boolean();

j.is_number();

j.is_object();

j.is_array();

j.is_string();

// comparison

cout << (j == "[\"foo\", 1, true]"_json) << endl; // true

// create an object

json o;

o["foo"] = 23;

o["bar"] = false;

o["baz"] = 3.141;

// special iterator member functions for objects

for (json::iterator it = o.begin(); it != o.end(); ++it) {

std::cout << it.key() << " : " << it.value() << "\n";

}

// find an entry

if (o.find("foo") != o.end()) {

// there is an entry with key "foo"

cout << *o.find("foo") << endl;

}

// or simpler using count()

int foo_present = o.count("foo"); // 1

int fob_present = o.count("fob"); // 0

cout << foo_present << endl;

cout << fob_present << endl;

// delete an entry

o.erase("foo");

cout << (o.find("foo") == o.end()) << endl;

return 0;

}

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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

2.4 STl与json转换

允许把STL与json相转换。

#include

#include

#include

#include

#include

#include

#include "json.hpp"

using json = nlohmann::json;

using std::cout;

using std::endl;

using std::cin;

int main(int argc, const char * argv[]) {

std::vector c_vector {1, 2, 3, 4};

json j_vec(c_vector);

// [1, 2, 3, 4]

std::deque c_deque {1.2, 2.3, 3.4, 5.6};

json j_deque(c_deque);

// [1.2, 2.3, 3.4, 5.6]

std::list c_list {true, true, false, true};

json j_list(c_list);

// [true, true, false, true]

std::forward_list c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};

json j_flist(c_flist);

// [12345678909876, 23456789098765, 34567890987654, 45678909876543]

std::array c_array {{1, 2, 3, 4}};

json j_array(c_array);

// [1, 2, 3, 4]

std::set<:string> c_set {"one", "two", "three", "four", "one"};

json j_set(c_set); // only one entry for "one" is used

// ["four", "one", "three", "two"]

std::unordered_set<:string> c_uset {"one", "two", "three", "four", "one"};

json j_uset(c_uset); // only one entry for "one" is used

// maybe ["two", "three", "four", "one"]

std::multiset<:string> c_mset {"one", "two", "one", "four"};

json j_mset(c_mset); // only one entry for "one" is used

// maybe ["one", "two", "four"]

std::unordered_multiset<:string> c_umset {"one", "two", "one", "four"};

json j_umset(c_umset); // both entries for "one" are used

// maybe ["one", "two", "one", "four"]

return 0;

}

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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

对于关联容器,json直接把map中的键值对转化为json的object。

std::map<:string int> c_map { {"one", 1}, {"two", 2}, {"three", 3} };

json j_map(c_map);

// {"one": 1, "three": 3, "two": 2 }

std::unordered_map c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} };

json j_umap(c_umap);

// {"one": 1.2, "two": 2.3, "three": 3.4}

std::multimap<:string bool> c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };

json j_mmap(c_mmap); // only one entry for key "three" is used

// maybe {"one": true, "two": true, "three": true}

std::unordered_multimap<:string bool> c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };

json j_ummap(c_ummap); // only one entry for key "three" is used

// maybe {"one": true, "two": true, "three": true}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

json还提供隐式类型转换。

/// strings

std::string s1 = "Hello, world!";

json js = s1;

std::string s2 = js;

// Booleans

bool b1 = true;

json jb = b1;

bool b2 = jb;

// numbers

int i = 42;

json jn = i;

double f = jn;

// etc.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

也可以使用显式类型转换。

std::string vs = js.get<:string>();

bool vb = jb.get();

int vi = jn.get();

// etc.

1

2

3

4

2.5 json最重要的还是设计config文件

例如以下:

json question = {

{"question",{

{

{"id",0},

{"choice_type","single"},

{"grading",{

{"max_grade",10},

{"half_grade",5}

}},

{"standard_answer",{1}},

{"deion","this is a test for choice judger"},

{"choice",{

{

{"id",0},

{"deion","nope"}

},

{

{"id",1},

{"deion","B"}

},

{

{"id",2},

{"descrition","C"}

},

{

{"id",3},

{"deion","D"}

}

}

}

},

{

{"id",1},

{"choice_type","double"},

{"grading",{

{"max_grade",10},

{"half_grade",5}

}},

{"standard_answer",{1, 2}},

{"deion","this is a test for choice judger"},

{"choice",{

{

{"id",0},

{"deion","nope"}

},

{

{"id",1},

{"deion","B"}

},

{

{"id",2},

{"descrition","C"}

},

{

{"id",3},

{"deion","D"}

}

}

}

},

{

{"id",2},

{"choice_type","multi"},

{"grading",{

{"max_grade",10},

{"half_grade",5}

}},

{"standard_answer",{1,2}},

{"deion","this is a test for choice judger"},

{"choice",{

{

{"id",0},

{"deion","nope"}

},

{

{"id",1},

{"deion","B"}

},

{

{"id",2},

{"descrition","C"}

},

{

{"id",3},

{"deion","D"}

}

}

}

}

}

},

{"deion","this is choice questions!"}

};

json answer = {

{

{"question_id",1},

{"choice_id",{1}}

},

{

{"question_id",0},

{"choice_id",{1}}

},

{

{"question_id",2},

{"choice_id",{1,2,3}}

}

};

---------------------

作者:AI图哥

原文:https://blog.csdn.net/sinat_24143931/article/details/84974154

版权声明:本文为博主原创文章,转载请附上博文链接!

c9d93a9893f15480a105b3861c0139c1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Excle数据透透视表】如何删除数据透视表

选中区域A4:C17,在键盘上按DELETE键删除&#xff0c;结果提示&#xff1a;那么如何删除呢&#xff1f;解决方案选中整个数透视表&#xff0c;再删除具体操作&#xff1a;选中整个数据透视表→DELETE注意&#xff1a;删除之后&#xff0c;源数据不会受到影响转载于:https://www.…

java 启动redis服务器_docker启动redis并使用java连接

一、先查找镜像docker search redis二、拉取镜像docker pull redis三、等待拉取完毕四、查看拉去的镜像docker iamges五、运行redis连接1&#xff1a;https://blog.csdn.net/weixin_38956287/article/details/80423607连接2&#xff1a;http://www.runoob.com/docker/docker-in…

【算法学习】整体二分

我们开门见山&#xff0c;讲讲一道sb题&#xff1a; 给你一个数组&#xff0c;查这个数组的第x大元素。 排序&#xff1f;可以 二分&#xff1f;怎么做啊&#xff1f; 二分出一个mid&#xff0c;判断这个数组中有多少个数小于等于mid&#xff0c;如果个数大于等于x&#xff0c;…

mysql100个优化技巧_完整篇:100+个MySQL调试和优化技巧(2)

▼MySQL模式优化51.检查和经常优化表.52. 经常重写InnoDB表优化.53. 有时&#xff0c;当添加列时删除索引&#xff0c;然后在添加回来索引&#xff0c;这样就会更快.54. 针对不同的需求&#xff0c;使用不同的存储引擎.55. 使用归档存储引擎日志表或审计表-这是更有效地写道.56…

简单的SQL注入学习

引贴&#xff1a; http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面&#xff0c;讲php页面放入/opt/lampp/htdocs目录下&#xff1a; 解释一下这个页面&#xff1a; 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_conne…

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

intellij idea 分屏设置 与快捷键

1、找到分屏功能 File -> setting -> keymap&#xff0c;搜索&#xff08;注意大小写&#xff09;&#xff1a;   Split Vertically 水平分屏   Split Horizontally 垂直分屏 2、设置快捷键&#xff0c; 编辑快捷键的地方在搜索框同一行&#xff1a;    在标签上直…

SSH整合方案二(不带hibernate.cfg.xml)

整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain;public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;privat…

POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

题意 : 有 n 种面额的硬币&#xff0c;给出各种面额硬币的数量和和面额数&#xff0c;求最多能搭配出几种不超过 m 的金额&#xff1f; 分析 : 这题可用多重背包来解&#xff0c;但这里不讨论这种做法。 如果之前有接触过背包DP的可以自然想到DP数组的定义 > dp[i][j] 表示…

css用hover制作下拉菜单

首先我们的需求就是 制作一个鼠标移动到某个区域就会有下拉菜单的弹出,这样会有更多的子类内容,示例代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{mar…

mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?

本文来源于公众号&#xff1a; 跬步匠心什么是索引&#xff1f;当我们使用汉语字典查找某个字时&#xff0c;我们会先通过拼音目录查到那个字所在的页码&#xff0c;然后直接翻到字典的那一页&#xff0c;找到我们要查的字&#xff0c;通过拼音目录查找比我们拿起字典从头一页一…

mysql使用jtable_jtable 的简单使用

做后台管理管理系统时&#xff0c;基于ajax的数据操作和富有表现力的数据绑定插件jtable绝对是一个不错的选择&#xff0c;他接收来自服务器端的json格式的数据。而且他是一款开源的基于jquery和jquery ui的插件&#xff0c;您可以根据自己的需要修改其表现&#xff0c;如css&a…

java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

微信公众号开发 自定义菜单请先读完本文再进行配置开发请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明在微信公众账号开发中&#xff0c;往往有定义一个菜单&#xff0c;然后用户点击该菜单就进入用户个人中心的功能&#xff0c;通常应用于各个公众账号…

贝叶斯理论基础理解

从贝叶斯方法谈到贝叶斯网络&#xff1a; http://blog.csdn.net/zdy0_2004/article/details/41096141 1 思考模式 比如往台球桌上扔一个球&#xff0c;这个球落会落在何处呢&#xff1f;如果是不偏不倚的把球抛出去&#xff0c;那么此球落在台球桌上的任一位置都有着相同的机…

C++如何实现DNS域名解析转

C如何实现DNS域名解析 这片文章介绍了C如何实现DNS域名解析&#xff0c;还有对相关技术的介绍&#xff0c;代码很详细,需要的朋友可以参考下一、概述 现在来搞定DNS域名解析&#xff0c;其实这是前面一篇文章C实现Ping里面的遗留问题&#xff0c;要干的活是ping的过程中画红线的…

高等代数第3版下 [丘维声 著] 2015年版_2020年成人高考 专升本 高等数学复习攻略...

成人高考的高等数学考试按照专业属性分为理工类和经管类&#xff0c;高等数学一直是成考中的比较不好拿分的科目&#xff0c;也是大家复习备考的难点。今天&#xff0c;小编给大家分享一些答题技巧和必备的公式&#xff0c;帮助大家一起来搞定高等数学&#xff0c;希望这份资料…

java虚拟机10.内存模型与线程

多任务处理在现代计算机操作系统中是一项必备的功能&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大&#xff0c;大量的时间都花费在磁盘I/O&#xff0c;网…

php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码

生产图片区域&#xff0c;上传按钮#btn可替换自己想要的图片plupload上传var uploader new plupload.Uploader({//创建实例的构造方法runtimes: html5,flash,silverlight,html4, //上传插件初始化选用那种方式的优先级顺序browse_button: btn, // 上传按钮url: "ajax.php…

笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠

嘉兴专业笔记本电脑喷漆加工厂价格实惠 [xznugcbx]不宜大量储存或久存&#xff0c;做好通风设施。自喷漆如果大量泄露操作人员应迅速撤离泄露污染区人员到安全区域&#xff0c;因罐内的二甲醚气体具有轻微的毒性&#xff0c;并将污染区域进行隔离&#xff0c;罐内的气体跟空气中…

css 滤镜之AlphaImageLoader

CreateTime--2017年12月25日17:05:37 Author:Marydon ie滤镜特效之AlphaImageLoader 作用&#xff1a; 用于设置背景图片特效样式 使用条件&#xff1a; IE8及以下版本不支持属性background-size&#xff0c;可以使用AlphaImageLoader来代替 语法&#xff1a; filter : progid:…