来自

从零开始的 JSON 库教程
从零开始教授如何写一个符合标准的 C 语言 JSON 库
作者 Milo Yip

https://zhuanlan.zhihu.com/json-tutorial

根据第一课教程 自己重新编写 做了一点修改 加深学习印象

//JsonParse.h
#pragma once
#include "JsonStruct.h"
#include <assert.h> void DEFParseWhitespace(MyJsonStruct& js)
{
while (js.jsonStr[js.index] == ' ' ||
js.jsonStr[js.index] == '\r' ||
js.jsonStr[js.index] == '\n') {
js.index++;
}
} DefParseResult DEFParseNull(MyJsonStruct& js)
{
assert(js.jsonStr[js.index] = 'n');
if (js.jsonStr[js.index + 1] != 'u' ||
js.jsonStr[js.index+2] != 'l' ||
js.jsonStr[js.index+3] != 'l') {
return DEF_PARSE_INVALID_VALUE;
}
js.index += 4;
js.type = DEF_NULL;
return DEF_PARSE_OK;
} DefParseResult DEFParseValue(MyJsonStruct& js)
{
switch (js.jsonStr[js.index]){
case 'n':return DEFParseNull(js);
case '\0':return DEF_PARSE_EXPECT_VALUE;
default:return DEF_PARSE_INVALID_VALUE;
}
} DefParseType GetParseType(MyJsonStruct& js)
{
return js.type;
} void ResetJsonStruct(const char* jsonBuf, MyJsonStruct& js)
{
js.jsonStr = jsonBuf;
js.index = 0;
js.type = DEF_NONE;
} MyJsonStruct InitJsonStruct(char* jsonBuf)
{
MyJsonStruct jsonStruct;
ResetJsonStruct(jsonBuf, jsonStruct);
return jsonStruct;
} DefParseResult DEFParse(MyJsonStruct& jsonStruct)
{
DefParseResult ret; DEFParseWhitespace(jsonStruct); if ((ret = DEFParseValue(jsonStruct)) == DEF_PARSE_OK) {
DEFParseWhitespace(jsonStruct);
if (jsonStruct.index < jsonStruct.jsonStr.size()) {
ret = DEF_PARSE_ROOT_NOT_SINGULAR;
jsonStruct.type = DEF_NONE;
} }
return ret;
}

  

//JsonStruct.h
#pragma once
#include <string> enum DefParseType {
DEF_NONE,
DEF_NULL,
DEF_FALSE,
DEF_TRUE,
DEF_NUMBER,
DEF_STRING,
DEF_ARRAY,
DEF_OBJECT
}; struct MyJsonStruct {
std::string jsonStr;
size_t index;
DefParseType type;
}; enum DefParseResult{
DEF_PARSE_OK = 0,
DEF_PARSE_EXPECT_VALUE,
DEF_PARSE_INVALID_VALUE,
DEF_PARSE_ROOT_NOT_SINGULAR
};

  

//MyTestUnit.h
#pragma once
#include <iostream> class MyTestClass {
static size_t testCount_;
static size_t testPass_;
public:
template<typename E,typename A>
bool ExceptEqual(E e, A a)
{
testCount_++;
if (e == a){
testPass_++;
return true;
}
return false;
} void PrintResult(){
std::cout << testPass_ << "/" << testCount_ << "\t" << "("<<(testPass_ * 100.0 / testCount_) << "%)" << " passed." << std::endl;
}
};
size_t MyTestClass::testCount_ = 0;
size_t MyTestClass::testPass_ = 0; #define ERROR_PRINT(expect,actual) \
std::cerr << __FILE__ <<":"<< __LINE__ << "\r\nexpect: " << expect << " actual: " << actual << std::endl; #define EXCEPT_EQ(expect, actual) \
do{ \
MyTestClass TEST; \
if(!TEST.ExceptEqual(expect, actual)){ \
ERROR_PRINT(expect,actual) \
} \
}while(0) #define PRINT_TEST_RESULT() \
do{ \
MyTestClass TEST; \
TEST.PrintResult(); \
}while(0)

  

// MyJson.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "JsonParse.h"
#include <iostream>
#include "MyTestUnit.h" int main()
{
MyJsonStruct js =InitJsonStruct("null");
EXCEPT_EQ(DEF_PARSE_OK, DEFParse(js));
EXCEPT_EQ(DEF_NULL, GetParseType(js)); ResetJsonStruct("", js);
EXCEPT_EQ(DEF_PARSE_EXPECT_VALUE, DEFParse(js));
EXCEPT_EQ(DEF_NONE, GetParseType(js)); ResetJsonStruct(" ", js);
EXCEPT_EQ(DEF_PARSE_EXPECT_VALUE, DEFParse(js));
EXCEPT_EQ(DEF_NONE, GetParseType(js)); ResetJsonStruct("nul", js);
EXCEPT_EQ(DEF_PARSE_INVALID_VALUE, DEFParse(js));
EXCEPT_EQ(DEF_NONE, GetParseType(js)); ResetJsonStruct("?", js);
EXCEPT_EQ(DEF_PARSE_INVALID_VALUE, DEFParse(js));
EXCEPT_EQ(DEF_NONE, GetParseType(js)); ResetJsonStruct("null x", js);
EXCEPT_EQ(DEF_PARSE_ROOT_NOT_SINGULAR, DEFParse(js));
EXCEPT_EQ(DEF_NONE, GetParseType(js)); PRINT_TEST_RESULT();
return 0;
}

  测试效果

12/12 (100%) passed.
请按任意键继续. . .

状态机学习(三)解析JSON的更多相关文章

  1. jQuey知识点三 解析json数据

    1.解析简单数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vie ...

  2. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  3. Android学习系列(20)--App数据格式之解析Json

    JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习.     恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位.     为了文 ...

  4. 解析Json字符串的三种方法

    在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 jso ...

  5. Java创建和解析Json数据方法(三)——json-lib包的使用

    (三)json-lib包的使用         这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...

  6. 前端学习之——js解析json数组

    ** 前端学习之——js解析json数组** 解析json数组即对JSONArray的遍历 一.对于标准的json数组如: var result=[{"flag":1," ...

  7. go 中解析JSON的三种姿势

    背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...

  8. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  9. iOS 学习 - 22 异步解析 JSON,使用 FMDB 存储,TableView 显示

    前提是已经知道了有哪些 key 值 Model 类: .h @interface ListModel : NSObject @property (nonatomic, copy)NSString *t ...

  10. C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)

    准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...

随机推荐

  1. Shell 显示带颜色字体

    格式: echo "/033[字背景颜色;字体颜色m字符串/033[控制码"如果单纯显示字体颜色可以固定控制码位0m.格式: echo "/033[字背景颜色;字体颜色m ...

  2. 下载sdk版本: 在hosts文件中追加以下信息

    下载sdk版本:在hosts文件中追加以下信息: 74.125.113.121 developer.android.com 203.208.46.146 dl.google.com 203.208.4 ...

  3. mfc_随机数生成器

    vc++6.0 内涵图

  4. RMAN_学习笔记3_RMAN Catalog恢复目录

    2014-12-23 Created By BaoXinjian

  5. libpcap和WinPcap

    能从物理上访问网络上的流量后,你需要用软件把它记录下来.这里,我们探究记录.解析和分析被捕获的数据包中最常用的软件库:libpcap和WinPcap.也将介绍包括tcpdump.Wireshark等基 ...

  6. 3. sort命令

    转自:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分 ...

  7. Flex布局总结

    2009年,W3C提出了一种新的方案----Flex布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能.lex布局将成为未来布局 ...

  8. [LINUX] 查看连接数和IO负载

    Iostat 是 sysstat 工具集的一个工具,需要安装. Centos的安装方式是: yum install sysstat Ubuntu的安装方式是: aptitude install sys ...

  9. MyEclipse+Tomcat 启动时出现A configuration error occured during startup错误的解决方法

    MyEclipse+Tomcat 启动时出现A configuration error occured during startup错误的解决方法 分类: javaweb2013-06-03 14:4 ...

  10. MVC 為頁面的list資料重新命名

    function ReBookFileName() {                              $("#div_sortable").find("li[ ...