json11库的使用

news/2024/5/20 15:53:43

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式,易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许多不同的编程语言。

几乎所有与网页开发相关的语言都有JSON库。JSON比XML更小、更快。

JSON用于描述数据结构,有以下形式存在:

(1)、对象(object):一个对象以”{“开始,并以”}”结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用”,”分隔。

(2)、名称/值(collection):名称和值之间使用”:”隔开。一个名称是一个字符串;一个值 (value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套

JSON语法规则:(1)、数据在键值对中;(2)、数据由逗号分隔;(3)、花括号保存对象;(4)、方括号保存数组。

JSON的值可以是:

(1)、数值:一系列0-9的数字组合,可以为负数或者小数。还可以用”e”或者”E”表示为指数形式。数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

(2)、字符串:以""括起来的一串字符。字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。

(3)、布尔值:表示为true或者false。

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

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

(6)、null

空白可以加入到任何符号之间。

各式各样开源的JSON库非常多,这里介绍下GitHub上dropbox的json11库的使用,地址:https://github.com/dropbox/json11,它用起来非常方便,只有两个文件,一个json11.hpp,一个json11.cpp。

新建一个Json11_Test控制台工程,将json11的两个文件加入到此工程中,测试代码Json11_Test.cpp如下:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "json11.hpp"#ifdef _MSC_VER
#include <Windows.h>
static std::string utf8_to_gbk(const char* utf8) {char gbk[256];const int maxlen = 256;wchar_t unicode_str[maxlen];int outlen = MultiByteToWideChar(CP_UTF8, 0, utf8, strlen(utf8), unicode_str, maxlen);outlen = WideCharToMultiByte(CP_ACP, 0, unicode_str, outlen, gbk, 256, NULL, NULL);gbk[outlen] = '\0';std::string str;str.assign(gbk);return str;
}
#endifint test1();
int test2();
int test3();
int test4();int main()
{test4();std::cout << "ok" << std::endl;return 0;
}int test4()
{//std::istringstream  std::filebuf in;if (!in.open("E:/GitCode/Messy_Test/testdata/json.data", std::ios::in)) {std::cout << "fail to open file" << std::endl;return -1;}std::istream iss(&in);std::istreambuf_iterator<char> eos;std::string s(std::istreambuf_iterator<char>(iss), eos);std::string err;auto json = json11::Json::parse(s, err);if (!err.empty()) {in.close();return -1;}std::cout << "************** show file info *****************" << std::endl;std::string json_str = json.dump();std::cout << json_str << std::endl;std::cout << "*************** start parse ****************" << std::endl;std::string name = json["name"].string_value();std::string addr = json["address"].string_value();int age = json["age"].int_value();json11::Json::array array_ = json["value1"].array_items();std::vector<std::vector<float>> value1;value1.resize(array_.size());for (int i = 0; i < array_.size(); i++) {json11::Json::array tmp = array_[i].array_items();value1[i].resize(tmp.size());for (int j = 0; j < tmp.size(); j++) {value1[i][j] = tmp[j].number_value();}}std::vector<float> value2;array_ = json["value2"].array_items();value2.resize(array_.size());for (int i = 0; i < array_.size(); i++) {value2[i] = array_[i].number_value();}std::string beijing_addr;bool beijing_car, beijing_cat;if (json["bei_jing"].is_null()) {std::cout << "failed to get bei_jing info" << std::endl;} else {json11::Json::object object_ = json["bei_jing"].object_items();beijing_addr = object_["address"].string_value();beijing_car = object_["car"].bool_value();beijing_cat = object_["cat"].bool_value();}std::string shandong_addr, tmp_addr;std::vector<std::string> shandong_value1;if (json["shan_dong"].is_null()) {std::cout << "failed to get shan_dong info" << std::endl;} else {json11::Json::object object_ = json["shan_dong"].object_items();tmp_addr = object_["tmp"].string_value();if (tmp_addr == "") {std::cout << "tmp is null" << std::endl;}shandong_addr = object_["address"].string_value();json11::Json::array tmp = object_["value1"].array_items();shandong_value1.resize(array_.size());json11::Json json_ = tmp[0];shandong_value1[0] = json_["ji_nan"].string_value();json_ = tmp[1];shandong_value1[1] = json_["tai_an"].string_value();}std::cout << "************** parse result ***************" << std::endl;std::cout << "name: " << utf8_to_gbk(name.c_str()) << std::endl;std::cout << "address: " << utf8_to_gbk(addr.c_str()) << std::endl;std::cout << "age: " << age << std::endl;std::cout << "value1: " << std::endl;for (int i = 0; i < value1.size(); i++) {for (int j = 0; j < value1[i].size(); j++) {std::cout << "  " << value1[i][j];}std::cout << std::endl;}std::cout << "value2: " << std::endl;for (int i = 0; i < value2.size(); i++) {std::cout << "  " << value2[i];}std::cout << std::endl;std::cout << "bei_jing info: " << std::endl;std::cout << "  address: " << utf8_to_gbk(beijing_addr.c_str()) << std::endl;std::cout << "  car: " << beijing_car << std::endl;std::cout << "  cat: " << beijing_cat << std::endl;std::cout << "shan_dong info: " << std::endl;std::cout << "  address: " << utf8_to_gbk(shandong_addr.c_str()) << std::endl;std::cout << "  value1: " << std::endl;std::cout << "    ji_nan: " << utf8_to_gbk(shandong_value1[0].c_str()) << std::endl;std::cout << "    tai_an: " << utf8_to_gbk(shandong_value1[1].c_str()) << std::endl;in.close();return 0;
}int test1()
{json11::Json my_json = json11::Json::object{{ "中国", "北京" },{ "key2", false },{ "key3", json11::Json::array { 1, 2, 3 } },};std::string json_str = my_json.dump();std::string key_1 = my_json["中国"].string_value();std::cout << json_str << std::endl;std::cout << key_1 << std::endl;return 0;
}int test2()
{class Point {public:int x;int y;Point(int x, int y) : x(x), y(y) {}json11::Json to_json() const { return json11::Json::array { x, y }; }};std::vector<Point> points = { { 1, 2 }, { 10, 20 }, { 100, 200 } };std::string points_json = json11::Json(points).dump();std::cout << points_json << std::endl;return 0;
}int test3()
{json11::Json json = json11::Json::array { json11::Json::object{ { "k", "v" } } };std::string str = json[0]["k"].string_value();std::cout << str << std::endl;return 0;
}

自己写了个Json格式的文本文件json.data,内容如下:

{"name": "spring","address": "北京","age": 30,"value1": [[23, 43, -2.3, 6.7, 90],[-9, -19, 10, 2],[-5, -55]],"value2": [13.3, 1.9, 2.10],"bei_jing": {"address": "海淀","car": false,"cat": true},"shan_dong": {"address": "济南","value1": [{"ji_nan": "趵突泉"}, {"tai_an": "泰山"}]}
}

测试代码中的test4()会调用json.data文件,执行结果如下图所示:

主要参考文献:

1. https://zh.wikipedia.org/wiki/JSON

2. http://www.json.org/json-zh.html

GitHub:https://github.com/fengbingchun/Messy_Test

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mysql邮箱配置文件_SQL-数据库邮箱配置

一、启用数据库邮件手动启用数据库邮件功能&#xff0c;需执行以下脚本&#xff1a;exec sp_configure show advanced options,1RECONFIGUREexec sp_configure Database Mail XPs,1RECONFIGURE With Override二、配置数据库邮件1、启用配置向导如果事先没有手动启用数据库邮件功…

029 浏览器不能访问虚拟机的问题解决

1.在搭建分布式时 ssh一直不能进行scp&#xff0c;后来发现一个问题。 windows中的hosts配置了三台虚拟机的映射&#xff0c;但是在虚拟机中的hosts没有配置。 做法是在每台虚拟机上都配置三台虚拟机的映射。 2.端口访问与防火墙 最近帮别人解决问题时才注意的。 以前安装好虚拟…

C++中fstream的使用

C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类&#xff0c;它们继承了插入和提取运算符&#xff08;以及其他成员函数&#xff09;&#xff0c;还有与文件一起使用的成员和构造函数。可将…

按esc键退出的一个函数

1functionesckey(keycode) // 按esc键退出2{ 3if (keycode 27 ) 4{ 5window.close() 6} 7}

判断输入是否为中文的函数

1functionischinese(s){ 2varrettrue ; 3for ( vari0 ;i < s.length;i) 4 retret &&(s.charCodeAt(i) > 10000 ); 5returnret; 6 }

内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具&#xff0c;它是一个开源免费的内存检测工具&#xff0c;它能够及时发现内存相关的编程错误&#xff0c;比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…

MyBatis中#{}和${}的区别

------------------------siwuxie095 MyBatis 中 #{} 和 ${} 的区别 1、在 MyBatis 的映射配置文件中&#xff0c;动态传递参数有两种方式&#xff1a; &#xff08;1&#xff09;#{} 占位符 &#xff08;2&#xff09;${} 拼接符 2、#{} 和 ${} 的区别 &#xff08;1&#xff…

列表框操作函数集合

1 /*列表框互相操作函数集 */23// 描述: 添加不重复列表框元素4functionselAdd( srcList, dstList )5 {6varselectedIndex newArray();7varcount 0 ;89for( i0 ; i < srcList.options.length; i ){1011if( srcList.options[i].selected ){1213selectedIndex[count] i;14…