json11库的使用
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
相关文章:
覆盖10亿设备,月活2亿,快应用要取代App?
作者 | 伍杏玲 来源 | CSDN(ID:CSDNnews) 2017 年 1 月 9 日,微信小程序横空出世,紧接着支付宝小程序、百度智能小程序、今日头条小程序、12 大厂商联盟的快应用等布局小程序。自此,小程序迅速改变国内移…

跨域的四种方式
本文主要是关于跨域的几种方式,关于什么是跨域这里就不多说了,写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解,页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源,获取到了之后ÿ…

使用模式创建一个面向服务的组件中间件
引言 在本文中,您将了解面向服务的组件中间件在用于资源有限的语音设备时,在设计阶段所应用的模式。它涵盖了项目的问题上下文,并被看成是一组决定因素,是对相关体系结构远景的一个简要概括。您还会得到一份描述,其中介…

OpenCV代码提取:遍历指定目录下指定文件的实现
OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便,这里将OpenCV 2.4.9中相关的函数给提取了出来,适合在Windows 64bits上使用。directory.hpp…

姚班三兄弟3万块创业八年,旷视终冲刺港股
作者 | 余洋洋 杨健楷编辑 | 张丽娟来源 | CV智识(ID:CVAI2019)旷视此次 IPO 或将成为整个 AI 行业的信号,不只是“ 四小龙”的另外三家——商汤、依图、云从,整个 AI 行业的创业公司都将受到影响。8月25日晚,AI 独角兽…
Java类加载器详解
Java虚拟机中的类加载有三大步骤:,链接,初始化.其中加载是指查找字节流(也就是由Java编译器生成的class文件)并据此创建类的过程,这中间我们需要借助类加载器来查找字节流. Java虚拟…

linux svn客户端的使用
一下内容转载于:http://blog.chinaunix.net/space.php?uid22976768&doblog&id1640924。这个总结的很好~ windows下的TortoiseSVN是资源管理器的一个插件,以覆盖图标表示文件状态,几乎所以命令都有图形界面支持,比较好用&…

C++中vector的使用
向量std::vector是一种对象实体,能够容纳许多各种类型相同的元素,包括用户自定义的类,因此又被称为序列容器。与string相同,vector同属于STL(Standard Template Library)中的一种自定义的数据类型,可以广义上认为是数组…

说出来你可能不信,现在酒厂都在招算法工程师
导语:虽然夏日已过,但人们喝啤酒的热情还在持续高涨。不过随着大众的追求和理念提升,对于啤酒的要求也越来越高,比如逐渐兴起的精酿之风,都在印证人们在啤酒的口感和风味上,拥有更加「苛刻」的要求。那么这…
「前端面试题系列7」Javascript 中的事件机制(从原生到框架)
前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化ES6 中箭头函数的用法this 的原理以及用法伪类与伪元素的区别及实战如何实现一个圣杯布局?今日头条 面试题和思路解析最近,…

安装Ecshop首页出现报错:Only variables should be passed by referen
出现下面这就话: Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\includes\cls_template.php on line 406 第406行:$tag_sel array_shift(explode( , $tag)); 解决办法 1 5.3以上版本的问题,应该也和配…

KDD 2019高维稀疏数据上的深度学习Workshop论文汇总
作者 | 深度传送门来源 | 深度传送门【导读】本文是“深度推荐系统”专栏的第九篇文章,这个系列将介绍在深度学习的强力驱动下,给推荐系统工业界所带来的最前沿的变化。本文简要总结一下阿里妈妈在 KDD 2019 上组织的第一届面向高维稀疏数据的深度学习实…
C++中fstream的使用
C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将…

浅谈Disruptor
Disruptor是一个低延迟(low-latency),高吞吐量(high-throughput)的事件发布订阅框架。通过Disruptor,可以在一个JVM中发布事件,和订阅事件。相对于Java中的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue),Disruptor的优点是性…

web 服务发布注意事项
1、在发布的时候首先查看服务器对外开放的端口,如果没有最好和客户进行沟通需要开放那些对应的端口,要不外界无法访问发布的站点。 2、在oracle需要远程控制服务器的数据库的时候需要开发1521端口。转载于:https://www.cnblogs.com/jzm53550629/p/337563…

OpenCV代码提取:resize函数的实现
之前在http://blog.csdn.net/fengbingchun/article/details/17335477 中有过对cv::resize函数五种插值算法的介绍。这里将OpenCV3.1中五种插值算法的代码进行了提取调整。支持N通道uchar和float类型。经测试,与OpenCV3.1结果完全一致。实现代码resize.hpp࿱…

IBM重磅开源Power芯片指令集?国产芯迎来新机遇?
整理 | 郭芮出品 | CSDN(ID:CSDNnews)自去年 IBM 以 340 亿美元收购了 Linux 巨头红帽之后,这家 107 岁的蓝色巨人终于又在开源方面有大动作了!近日在 Linux 基金会开源峰会上,IBM 宣布向开源社区提供 Powe…

构造函数不能为虚/重载函数总结
构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。 在解决这个问题之前,要先明白类中函数的调用方式。一个类的函数共用一个函数空间,因此在实例化的对象中是不…

通过data:image/png;base64把图片直接写在src里
2019独角兽企业重金招聘Python工程师标准>>> 关于用base64存储图片 网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZS…

算力“竞速”,企业AI落地的当务之急
充足的算力资源,在数据量持续增长及算法持续复杂化的前提下,无疑是保障人工智能应用落地效果的关键。软件定义算力——打造AI转型最佳实践8月2日,第四范式联合英特尔共同举办了AI实践者之声夏令营活动。第四范式基础架构负责人刘一鸣以《软件…
内存检测工具Dr. Memory的使用
Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明。在我们创建好Scrapy爬虫项目之后,会得到上图…

.net完整的图文验证
摘自:http://blog.csdn.net/durongjian/article/details/4336380 一、创建ValidaeCode类库工程: 1、创建ValidaeCode类库工程,在[解决胜方案资源管理器]面板中,右键单击[ValidateCode]节点,并选择[属性]命令。 2、单击[属性]命令&…

Tesseract-OCR 3.04在Windows7 vs2013上编译过程
从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录,用vs2013打开tesseract.sln。Tesseract依赖图像库Leptonica,Leptonica的编译过程可以参考http://blog.csdn.net/fengbingchun/article/d…

【Laravel-海贼王系列】第九章, Events 功能解析
Events 注册 框架如何在启动的时候加载注册的事件?框架如何触发事件?1,先在容器中注册 events 的全局对象。 Application 构造函数中对 events 进行注册代码 protected function registerBaseServiceProviders(){$this->register(new EventServiceProvider($th…

触类旁通,经典面试题最长公共子序列应该这么答
作者 | labuladong来源 | labuladong(ID:labuladong)【导读】最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问…

两分公支的IPSec***流量走总部测试
一.概述:在论坛上看到一个朋友发帖希望两个分支的IPSEC ***流量经过总部,如是搭建拓扑测试了一下,因为跑两个VM版的ASA8.42机器性能不过,所以用PIX8.0来代替ASA,应该主要配置都跟ASA8.0差不多。二.基本思路:A.两个分支…

OpenCV代码提取:cvtColor函数的实现
OpenCV中的cvtColor函数包括了很多颜色格式之间的转换,用起来很方便,这里对cvtColor函数的code进行了提取,经测试,和OpenCV3.1结果完全一致。实现代码cvtColor.hpp:// fbc_cv is free software and uses the same licence as Open…

关于java.util.LinkedHashMap cannot be cast to ......的解决办法
今天在项目中遇到一个问题,接口接收到list在对list进行遍历的时候报出如下错误: 断点看一下这个list感觉没有任何的问题: 那为什么会报这个错误呢 这个接口是这样的,在想会不会是json在转list的时候把这个list给整坏了。 于是,我把这个list再…

三两下实现NLP训练和预测,这四个框架你要知道
作者 | 狄东林 刘元兴 朱庆福 胡景雯编辑 | 刘元兴,崔一鸣来源 | 哈工大SCIR(ID:HIT_SCIR)引言随着人工智能的发展,越来越多深度学习框架如雨后春笋般涌现,例如PyTorch、TensorFlow、Keras、MXNet、Theano 和 PaddlePaddle 等。这…