首页 > 其他分享 >三. JSON数据解析(parse)

三. JSON数据解析(parse)

时间:2023-08-08 11:56:58浏览次数:35  
标签:__ struct json value parse JSON 解析

三. JSON数据解析(parse)

专栏目录

一. JSON

二. JSON基础数据结构

三. JSON数据解析(parse)

0. 引

我们现在已经将JSON的基础数据结构进行了C语言抽象了, 就像已经准备好了房子, 就等着入住了, 一般来说, JSON数据是以字符串形式由外部传入的, 被解析的对象就是这个JSON格式的字符串.

#include "list.h"
#include "rbtree.h"

#define JSON_VALUE_STRING 1
#define JSON_VALUE_NUMBER 2
#define JSON_VALUE_OBJECT 3
#define JSON_VALUE_ARRAY 4
#define JSON_VALUE_TRUE 5
#define JSON_VALUE_FALSE 6
#define JSON_VALUE_NULL 7

typedef struct __json_value json_value_t;
typedef struct __json_object json_object_t;
typedef struct __json_array json_array_t;

typedef struct __json_member json_member_t;
typedef struct __json_element json_element_t;

struct __json_value
{
    int type;
    union
    {
        char *string;
        double number;
        json_object_t object;
        json_array_t array;
    } value;
};

struct __json_array
{
    int size;

    struct list_head head;
};

struct __json_element
{
    struct list_head list;
    json_value_t value;
};

struct __json_object
{
    int size;

    struct list_head head;
    struct rb_root root;
};

struct __json_member
{
    struct list_head list;
    struct rb_node node;
    char key[1];
    json_value_t value;
};

为了解析JSON格式的字符串, 我们需要有一个函数, 入参是一个字符串, 出参当然就是json结构体, 这个函数的声明应该是这样:

json_value_t *json_value_parse(const char *jsonStr);

jsonStr​就是需要解析的JSON格式的字符串, json_value_t​就是我们需要的解析出来的JSON对象.

接下来, 让我们一步一步得来实现它.

章节目录

1. 解析总体流程

2. 类型分辨

3. 数值解析

4. 字符串解析

5. 数组解析

参考

[1] 从零开始的 JSON 库教程(四):Unicode - 知乎 (zhihu.com)

[2] Workflow 源码解析 Json parser :part1 parse - 知乎 (zhihu.com)

[3] Unicode字符平面映射 - 维基百科,自由的百科全书 (wikipedia.org)

[4] 字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志 (ruanyifeng.com)

[5] JSON数据类型 (biancheng.net)

标签:__,struct,json,value,parse,JSON,解析
From: https://www.cnblogs.com/xlqblog/p/json-data-analysis-parse-z1tkwmr.html

相关文章

  • Java HTTP请求 如何获取并解析返回的HTML内容
    JavaHTTP请求如何获取并解析返回的HTML内容在Java开发中,经常会遇到需要获取网页内容的情况。而HTTP请求是实现这一目标的常用方法之一。本文将介绍如何使用Java进行HTTP请求,并解析返回的HTML内容。JavaHTTP请求如何获取并解析返回的HTML内容首先,我们需要导入相关的Java类库:j......
  • .net core 单文件发布,找不到appsettings.json的问题
    解决方案config.SetBasePath(GetBasePath());config.AddJsonFile("appsettings.json",false);privatestringGetBasePath(){usingvarprocessModule=Process.GetCurrentProcess().MainModule;returnPath.GetDirectoryName(processModule?.FileName......
  • Linux jq 命令讲解与实战操作(json字符串解析工具)
    目录一、概述二、jq命令安装三、jq命令语法与示例详解1)基本用法2)常用选项3)查询和过滤1、选择字段2、过滤3、遍历数组4、组合操作4)修改和创建1、修改字段值:2、创建新字段:3、组合操作:4、条件修改5)运算符1、数值运算2、比较运算:3、逻辑运算:4、条件运算:6)变量和条件1、使用变量:2、条......
  • Flink源码解析(零)——源码解析系列随笔说明
    00、博主仅是数据开发及数仓开发工程师,出于提升自身对Flink系统原理掌握考虑,自愿花费精力整理源码解析系列随笔,并非专业Flink系统开发人员,在源码解析过程中出现非专业行为望见谅。希望Flink系统开发专业人员多提意见,不胜感激。01、Flink源码解析系列随笔主要基于Flink1.17.1版本......
  • linux内网穿透应用场景有哪些?快解析有什么用处?
    随着网络技术的不断发展,无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案,为我们提供了无限可能。首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程......
  • Go / Golang JSON 一些心得
    自定义序列化和反序列化可以实现json.Marshaler和json.Unmarshaler自定义json的序列化和反序列化typeTags[]stringfunc(tTags)MarshalJSON()([]byte,error){return[]byte(strconv.Quote(strings.Join(t,","))),nil}func(t*Tags)UnmarshalJSON(b[]b......
  • IE浏览器如何设置默认内核版本,IE11怎么设置默认以IE8的方式解析
    今天修复项目兼容性BUG,用IE11兼容模式调试IE8上的问题,发现每次关闭再打开F12都会以IE11的模式加载,网上搜了一下也没找到怎么设置,不过自己找了找,发现在仿真里可以保存当前设置,凑合可以用吧。但是关闭F12工具后,默认会切换回F11模式,可以通过保留仿真设置里防止其自动切回11。......
  • 2023年8月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojso
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • JMeter源码解析之结果收集器
    一、JMeter结果收集器概述JMeter是在压力领域中最常见的性能测试工具,由于其开源的特点,受到广大测试和开发同学的青睐。但是,在实际应用过程中,JMeter存在的一些性能瓶颈也凸显出来,经常会遇到大并发下压不上去的情况。笔者通过深入分析其源码实现,找到JMeter存在的瓶颈问题及根本原因,为......
  • Siemens 西门子PROFINET:设备名、IP地址、MAC地址解析分别有什么用?
    对于PROFINET网络来说,涉及了几个地址参数,设备名、IP地址、MAC地址。不仅如此,每个PROFINET的设备的MAC地址还有多个。如会存在接口模块的MAC地址和端口MAC地址。若一个接口下有多个端口就会有多个端口MAC地址。那么我们需要弄明白的一件事是,这些地址都有什么作用,有......