lept_json库的学习1

从两个星期前开始,在github上跟着叶劲峰老师的lept_json学习了一遍,现在来回顾一下整个过程,做些笔记之类的。
本人的记录风格是废话一大堆,所以不爱看的可以骂我。


一、 什么是JSON

一开始我是完全不知道json是什么的,在我初步了解完c语言,而c++还没学多少的时候,我就在github上看到了这个项目,当时看到个#ifndefine都是懵的,看叶老师讲为什么宏要写在do{}while
里面看了半天。现在看来,其实懂了就是懂了,没懂就去看懂。

JSON呢,主要有两个功能:Parse解析和Stringify生成

情景

比如说,就是我有一个字符串json,大概长这样:

字符串 json =
"{"Name":"LiuXingHuaHun","IsMarried":false,"Money":6998,"Children":["zty","zsy"],"Possession":{"Cars":10,"House":20},"Girlfriend":null}
"

Parse解析

然后,我有一个json库,里面有一个函数叫Parse()

Parse的中文意思是解析,我一开始不认识这个单词,所以懵了好久(当时也没即时去查,像个傻逼一样,后来查了就懂了)

Parse()这个解析函数,有两个参数,比如叶老师教的lept_parse()

int lept_parse(lept_value& v, const char* json)

简单来讲,第一个参数类型lept_value是一个lept_json库里的一个通用数据结构,代码如下:

struct lept_value{//一个值不可能同时为数字和字符串,因此我们可使用 C 语言的 union 来节省内存:union{struct { lept_member* m; size_t size,capacity; }m_obj;/* object */struct { lept_value* e;  size_t size,capacity; }m_arr;/* array */struct  { char* s; size_t len; }m_str;      /* string */double m_num;                               /* number */}u;lept_type type;
};

不用看里面包含了什么,我们说第二个参数json,就是字符串,类型为char *。
parse()就是把字符串给转化为json内部的value数据结构,然后就可以用json内部的一些工具函数(人们叫他API),来更加灵活的有规则的使用这个json字符串里面包含的信息。进行一些运算啊,增删查改啊,分析啊之类的。

总之,然后我用完了之后,我得到了一堆信息,比如:

"{"LiuXingHuaHun": "nobody"}
"

Stringify生成

即使这个信息很简单,我需要发送出去,我还是需要将其转换为字符串吧。
然后就要用到Stringify()函数,也就是生成。(parse和stringify我是同时查的意思)
还是来看看lept_stringify长什么样吧

char* lept_stringify(const lept_value& v, size_t length)

这个函数也很好理解,你需要给他一个lept_value类型的数据,后面是这个数据的长度,然后他返回一个字符串。就是说它把你得到的信息,又转化为了字符串,然后就可以保存,或者是直观的阅读,发送给别人之类的。

因为内存分配什么的都需要精细操作,所以数据的长度作为一个参数是很有必要的,这是我个人的理解

JSON的主要作用就是解析和生成。
将文本信息解析转化为计算机可理解使用的数据结构,
将数据结构生成转化为人们可以阅读理解的文本信息。
(什么废话文学)

#mermaid-svg-Vzy8UI5fOuIeeZR6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .error-icon{fill:#552222;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .marker.cross{stroke:#333333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vzy8UI5fOuIeeZR6 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actor-line{stroke:grey;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .sequenceNumber{fill:white;}#mermaid-svg-Vzy8UI5fOuIeeZR6 #sequencenumber{fill:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .messageText{fill:#333;stroke:#333;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .labelText,#mermaid-svg-Vzy8UI5fOuIeeZR6 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .loopText,#mermaid-svg-Vzy8UI5fOuIeeZR6 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Vzy8UI5fOuIeeZR6 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .noteText,#mermaid-svg-Vzy8UI5fOuIeeZR6 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actorPopupMenu{position:absolute;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vzy8UI5fOuIeeZR6 .actor-man circle,#mermaid-svg-Vzy8UI5fOuIeeZR6 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Vzy8UI5fOuIeeZR6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}HumanComputerParse解析Stringify生成数据结构文本信息HumanComputer

二、 JSON中的数据类型

上面的例子中我用到了false、6998、“none”、null这些数据,实际上json库里面一共有六种数据类型:

  • NULL 空
  • BOOL(TRUE,FALSE)布尔值
  • NUMBER 数字
  • STRING 字符串 用“”引号括起来
  • ARRAY 数组 包含多种类型 用[]中括号括起来
  • OBJECT 对象 包含多种类型,用{}花括号括起来,且每个对象有一个字符串类型的Key值(键值对),我更喜欢称Key为Name

Example

"/*整个信息是包含在字符串里,所以用双引号括起来*/{//整个是一个object对象,所以用花括号{}括起来"Name":"LiuXingHuaHun",  //第一个对象是string,key为"Name",value为"LiuXingHuaHun""IsMarried":false,       //第二个对象是bool,  key为"IsMarried",value为false"Money":6998,            //第三个对象是number,key为"Money",value为6998"Children":["zty","zsy"],//第四个对象是array, key为"Chilren",value为两个string"Possession":            //第五个对象是object,key为"Possession",//value为一个number和一个bool{"Cars":0,"House":false},"Girlfriend":null        //第六个对象是我没有对象}
"

很好理解对吧。

#mermaid-svg-97xkttOMEjPGE5kG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-97xkttOMEjPGE5kG .error-icon{fill:#552222;}#mermaid-svg-97xkttOMEjPGE5kG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-97xkttOMEjPGE5kG .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-97xkttOMEjPGE5kG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-97xkttOMEjPGE5kG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-97xkttOMEjPGE5kG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-97xkttOMEjPGE5kG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-97xkttOMEjPGE5kG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-97xkttOMEjPGE5kG .marker.cross{stroke:#333333;}#mermaid-svg-97xkttOMEjPGE5kG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-97xkttOMEjPGE5kG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-97xkttOMEjPGE5kG .cluster-label text{fill:#333;}#mermaid-svg-97xkttOMEjPGE5kG .cluster-label span{color:#333;}#mermaid-svg-97xkttOMEjPGE5kG .label text,#mermaid-svg-97xkttOMEjPGE5kG span{fill:#333;color:#333;}#mermaid-svg-97xkttOMEjPGE5kG .node rect,#mermaid-svg-97xkttOMEjPGE5kG .node circle,#mermaid-svg-97xkttOMEjPGE5kG .node ellipse,#mermaid-svg-97xkttOMEjPGE5kG .node polygon,#mermaid-svg-97xkttOMEjPGE5kG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-97xkttOMEjPGE5kG .node .label{text-align:center;}#mermaid-svg-97xkttOMEjPGE5kG .node.clickable{cursor:pointer;}#mermaid-svg-97xkttOMEjPGE5kG .arrowheadPath{fill:#333333;}#mermaid-svg-97xkttOMEjPGE5kG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-97xkttOMEjPGE5kG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-97xkttOMEjPGE5kG .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-97xkttOMEjPGE5kG .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-97xkttOMEjPGE5kG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-97xkttOMEjPGE5kG .cluster text{fill:#333;}#mermaid-svg-97xkttOMEjPGE5kG .cluster span{color:#333;}#mermaid-svg-97xkttOMEjPGE5kG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-97xkttOMEjPGE5kG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

string
bool
number
array
string
string
object
null
number
bool
object
Name
IsMarried
Money
Children
zty
zsy
Possesion
GF
car
house

三、单元测试

要说从lept_json中学到了什么,其实单元测试是很重要的一块。
我每写完一个函数,我就要去测试它,而一个函数,或者说一个API,无非就是输入输出。
那么测试就只要测试预期值expect和实际运算值actual,然后比对二者是否一样就可以了。

仅仅听上面这些话,可能会觉得测试没什么用,但是我个人认为,一个程序设计出来,应该先有单元测试,再有程序代码。
单元测试方便我们进行代码评估和重构,当我们因为某些原因需要改进原代码时,有单元测试就可以很方便的感受到我的改进是否对代码整体会有影响。而叶老师的单元测试这一块也是写得很漂亮。
下面列出代码:

static int main_ret = 0;
static int test_count = 0;
static int test_pass = 0;//判断equality,若为true,则pass++,否则输出期望expect与实际结果actual
#define EXPECT_EQ_BASE(equality, expect, actual, format) \do {\test_count++;\if (equality)\test_pass++;\else {\fprintf(stderr, "%s:%d: expect: " format " actual: " format "\n", __FILE__, \__LINE__, expect, actual);\main_ret = 1;\}\} while(0)//对上面的宏再进行简化,只要输入需要比对的两个值就可以判断
#define EXPECT_EQ_INT(expect, actual) \EXPECT_EQ_BASE((expect) == (actual), expect, actual, "%d")

如果测试完全通过输出示例:
如果有没通过的测试:忽略掉我前面乱七八糟的文件夹套娃,可以看到,他会准确的报错,然后指出期望值expect和实际值actual的不同,还会精确的显示通过率,总之我非常喜欢这种直观的可视化交互(虽然可以肯定现在已经有很多更高级更快捷的方法)


lept_json Github:https://github.com/miloyip/json-tutorial

本人流星画魂第一次在csdn上做笔记,有什么错误或者是需要改进的地方请即时提出
我只是一个对编程感兴趣的人,但懒得要死,学得又不认真,希望读者能骂就骂两句,真的太懒了

lept_json的学习之JSON相关推荐

  1. Android-入门学习笔记-JSON 解析

    4 构建优秀 UI 的技巧 6 USGS 地震实时反馈和通知: http://earthquake.usgs.gov/earthquakes/feed/v1.0/index.php 电子表格格式的 U ...

  2. JavaWeb学习笔记——JSON详解

    本文是学习Java时所记录的学习笔记,本节记录了JSON的相关知识,需要掌握JSON的书写格式,懂得JSON与String类型的转换. 文章目录 JSON简介 什么是JSON? JSON语法规则 JS ...

  3. Kotlin学习之json数据解析

    通过这篇文章,可以学习到 1. 如何根据json数据创建一个对应的数据类 2. 如何根据json数据创建一个对象 (一)根据json数据创建一个对应的数据类 data class Test(val c ...

  4. Python可视化学习——使用JSON进行数据转换、pyecharts模块调用以及可视化案例的介绍(可视化案例数据暂无),柱状图及动态柱状图的构建

    数据可视化 可视化效果一:2020年印美日新冠累计确诊人数 2020年是新冠疫情爆发的一年,随着疫情的爆发,国内外确诊人数成了大家关心的热点,相信大家都有看过类似的疫情报告.本案例对印度美国日本三个国 ...

  5. python解析json_【python学习】json解析

    从一个网页获取数据,并按json格式进行转换. from urllib import request import json def fetch_data(url): req = request.Re ...

  6. 10. JavaScript学习笔记——JSON

    10. JSON ///[JSON是一种数据格式,不是JS 独有的] ///[JSON语法] /* 1.数据书写格式:"name":value,JSON要求给属性名加上[双引号], ...

  7. Android学习之JSON数据解析

    在Android应用开发中,常用的数据交换格式有XML和JSON,这两种方式各有各的好处,我们在特定的应用开发中可以选择合适的一种.下面来看一下JOSN数据解析: 例子永远是最好的教程,下面我们来看个 ...

  8. Python学习之==json处理

    json是一种所有语言都通用的Key-Value数据结构的数据类型,很像Python中的字典,在Python中可以通过json模块对json串和字典进行转换. 1.把字典转换成json串 1 impo ...

  9. 13 vue学习 package.json

    一:package.json文件详解 管理你本地安装的npm包 .定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件,自动 ...

最新文章

  1. 如何去掉系统快捷方式的箭头(转载)
  2. mysql 导入一个数据库_mysql导入一个数据库
  3. python数据分析常用包_python可视化数据分析常用图大集合(收藏)
  4. 开源Web应用中最常见漏洞是XSS和SQLI漏洞
  5. Zabbix监控环境的搭建
  6. 生成树的计数 Matrix-Tree(矩阵树)定理
  7. xlrd对excel单列处理
  8. java代码耗尽内存_有关Java内存溢出及内存消耗的小知识
  9. 可自由扩展的圆角矩形制作方法
  10. 企业网站 源码 e-mail_临汾网站制作,B2B软件哪家好
  11. QT新建项目显示项目未配置的原因与解决方案
  12. Javascript ES6 Promise异步链式读取文件解决回调地狱
  13. 1017 A除以B (20 分)—PAT (Basic Level) Practice (中文)
  14. 【转】MySQL用户创建权限管理
  15. Ubuntu下载QQ
  16. AP6212 蓝牙调试步骤
  17. 搭建owncloud私有云
  18. Mercury老版路由器WDS
  19. android 选择相册拍照图片 仿gridview九宫格 recycleview九宫格图片(可拖拽)
  20. 【金猿人物展】树根互联COO黄路川:从“灯塔工厂”到“数字领航”,工业互联网操作系统助推新型工业化...

热门文章

  1. TIA博途SCL入门学习(三)创建SCL程序及更改FB块接口的视图样式
  2. 中国书信礼仪 (三)
  3. 英国《新科学家》杂志:研究显示人们上假新闻的当可能是因懒得思考
  4. Array.prototype.pop()
  5. JAVA 删除json中反斜杠_如何去除spring的ModelMap的返回类型的JSON序列化字符串中带有反斜杠符号...
  6. android camera噪点,拍照时总是有很多噪点怎么办?方法很简单但你还真不知道
  7. java jxl 写 excel文件_Java使用jxl包写Excel文件适合列宽实现
  8. Symbian OS应用编程图形篇之架构
  9. python如何撤销上一步_python代码运行到某一步能返回到前面某一步吗?
  10. iPhone 13 120Hz屏幕稳了;AirPods Pro支持查找功能