JSON的C实现(上)

news2024/9/29 9:53:50

JSON的C实现(上)

  • JSON的C实现(上)
    • 前言
    • JSON简介
    • JSON的C实现思路
    • 小结

JSON的C实现(上)

前言

JSON是众多项目中较为常见的数据交换格式,为不同项目、系统间的信息交换提供了一个规范化标准。JSON的实现方式有很多,网上也有众多资源。本文是本着学习JSON结构的目的来讲述在C语言中实现JSON,起到抛砖引玉的目的,有别于直接拉取网上资源直接使用。这样方便读者做二次开发。

JSON简介

JSON是一种基于文本的轻量级数据交换格式。具体可参考JSON介绍

其主要有这几种基本结构:
键值对:用“键:值”的形式表示;
例如


"name": "John"
或
"age": 30

对象:被{ }包围,对象里的数据用键值对形式表示,不同的键值对之间用逗号“,”隔开;
JSON对象示意图

例如


{
    "name": "John",
    "age": 30
}

数组:被[ ]包围,数组是值的集合,不同值之间用逗号“,”隔开;
JSON数组示意图

例如:


[
    "掌芯元器",
    256,
    "true",
    {
        "name": "John",
        "age": 30,
        "Lucky numbers": [
            3,
            5,
            6
        ],
        "grades": {
            "math": 90,
            "english": 95
        }
    },
    [
        1,
        [
            2,
            3,
            4
        ],
        3
    ]
]

其中,JSON中的键必须是双引号括起来的字符串;值可以是双引号括起来的字符串、数值、布尔值、null、对象或者数组,它们之间是可以嵌套的,如下图:

JSON值示意图

JSON的C实现思路

我们由上文可知,JSON是由键值对、值、数组、对象等组成,我们要建立一个统一的数据结构来表示他们,并且它们之间可能存在着嵌套的关系,这些组成是树状结构,因此我们可以将其分为一个个节点,采用链表的方式将不同层级的数据组织起来。

所以我们创建的数据结构要包含当前节点的结构类型、具体数据、上下级节点的指针。

有了上述的数据结构,接下来就是怎么将字符串与JSON的数据结构进行转换。

我们可以看到JSON的内容表现有数字、BOOL值、字符串、NULL,我们先要编写这些基本的处理函数,然后再进行数据类型转换。

对于此,我们要思考:

如何判断将要处理的数据是字符串、数字、BOOL值、NULL值?以及对应的处理方法是什么?
我们可以将其拆分成一个个独立的函数去处理。

在上述问题的解决过程中,我们还要考虑到JSON的嵌套关系,当遇到"、,、{、}、[、]时,我们需要对其进行处理。

通过上述函数处理完一个JSON字符串之后,我们就可以得到一个个JSON节点,节点的结构中又将不同层级的数据组织起来。

而将JSON结构转换成字符串与上述思路相似,我们只需要将不同数据类型转换成字符串,然后将字符串拼接起来即可。

小结

介于篇幅,本文先对JSON的C实现做一下思想分析。

我们将会在后续的文章具体介绍如何使用C语言实现JSON的解析和转换。

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

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

相关文章

1.7 软件缺陷管理

欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 缺陷介绍2 缺陷描述及提交3 缺陷跟踪流程4 案例分析 前言 在软件开发和测试过程中,缺陷(通常称为“bug”)是不可避免的。了解和有效管理这些…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十二集:制作完整地图和地图细节设置以及制作相机系统的跟随玩家和视角锁定功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作完整的地图和地图细节设置 1.制作地图前的设置2.制作地图前期该做的事3.制作地图之堆叠素材4.制作地图后期该做的事5.制作地图之修复意想不到的Bug二、…

ping基本使用详解

在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为: 用来检测网络的连通情况和分析网络速度根据域名得到服务器 IP根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。我们通常会用它来直接 ping ip 地址,来测试网络的连…

Cisco Secure Firewall Management Center Virtual 7.4.2 - 思科 Firepower 管理中心软件

Cisco Secure Firewall Management Center Virtual 7.4.2 - 思科 Firepower 管理中心软件 Firepower Management Center Software 请访问原文链接:https://sysin.org/blog/cisco-fmc-7/,查看最新版。原创作品,转载请保留出处。 实现管理任务…

第十三届蓝桥杯真题Java 斐波那契与7(持续更新)

博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 问题描述 斐波那契数列的递推公式为: FnFn−1Fn−2Fn​Fn−1​Fn−2​, 其中 …

喜欢把家里打扫得很干净的人,大多活成了这样,不是迷信!

生活中,我们常常会遇到一些喜欢把家里打扫得干干净净的人。 对于这些人来说,整洁的环境不仅是一种生活习惯,更是一种对生活的态度。 其实,这种生活习惯背后,往往隐藏着他们的命运和未来发展。 以下是喜欢把家里打扫…

c++入门 类和对象(中)

文章目录 1. 类的默认成员函数2. 构造函数3. 析构函数4. 拷贝构造函数5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 日期类实现 6. 取地址运算符重载6.1 const成员函数6.2 取地址运算符重载 总结 1. 类的默认成员函数 默认成员函数就是用户没有显式实现,…

AutoGen框架进行多智能体协作—AI Agentic Design Patterns with AutoGen(一)

1. 多代理对话:单口喜剧 在AutoGen中,Agent是一个可以代表人类意图执行操作的实体,发送消息,接收消息,执行操作,生成回复,并与其他代理交互。AutoGen具有一个名为Conversible Agent的内置代理类…

Ps:打开与置入

在 Adobe Photoshop 中,理解不同的“打开”和“置入”命令及其用途,可以根据不同的需求选择最佳方式来管理和编辑图像文件。 ◆ ◆ ◆ 打开 1、Ps菜单:文件/打开 File/Open 快捷键:Ctrl O 用于直接打开现有的图像文件。 打开的…

httpsok-v1.17.0-SSL证书自动续签

🔥httpsok-v1.17.0-SSL证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞定…

naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用

一 naocs注册中心步骤 1 nacos下载安装 解压安装包,直接运行bin目录下的startup.cmd 这里双击运行出现问题的情况下 (版本低的naocs) 在bin目录下 打开cmd 运行以下命令 startup.cmd -m standalone 访问地址: http://localh…

【Linux】趣味讲解“权限“的那些事(重点讲解文件权限,内含su、sudo、chmod、chown、umask等指令)

文章目录 前言1. Linux下用户的分类1.1 su 指令1.1.1 使用su指令切换到其它的用户上1.1.2 使用su指令切换到root上1.1.3 su指令的总结 1.2 sudo指令(对某条指令进行提权)1.2.1 sudo指令的语法1.2.2 由sudo指令引发的思考问题 2. 什么叫做权限2.2 文件权限2.2.1 文件类型2.2.2 文…

UART驱动学习一(UART硬件介绍)

一、UART硬件介绍 1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。串口在嵌入式中用途非常的广泛,主要的用途有: 打印调试信息;外接各种模块:GPS、蓝牙&#xf…

JavaWeb 12.Tomcat10

希望明天能出太阳 或者如果没有太阳的话 希望我能变得更加阳光一点 —— 24.9.25 一、常见的JavaWeb服务器 Web服务器通常由硬件和软件共同构成 硬件:电脑,提供服务供其他客户电脑访问 软件:电脑上安装的服务器软件,安装后能提…

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库 一、环境说明二、分布式键值数据库介绍三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、分布式键值数据库介绍 KVStore简介: 分布式键值数据库…

手机电脑无缝对接,虫洞软件让多屏协同触手可及

在数字化时代,我们的日常生活和工作越来越依赖于电子设备,尤其是智能手机和电脑。但你是否曾因在手机和电脑之间频繁切换而感到烦恼?现在,有了虫洞软件,这一切都将成为过去式。 虫洞——电脑与手机的桥梁 虫洞软件&a…

Kubernetes整体架构与核心组件

一个 Kubernetes 集群的机器节点有两种角色—— Master 和 Node,都可由一个或多个节点组成,且同一个节点可以既是 Master 也是 Node。其中 Master 节点负责全局决策、资源调度、Node 与 Pod 管理,等等,属于管控节点;No…

【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)

文章目录 前言封装协程工具类,避免 GC(垃圾回收)使用1.使用默认方式使用协程2.使用自定义的 CoroutineTool 工具类来等待不同的时间 完结 前言 在 Unity 中,使用 yield return null 、yield return new WaitForEndOfFrame()等会导…

人物型Agent开发(文心智能体平台创作分享)

开发平台:文心智能体平台AgentBuilder | 想象即现实 目录 一、开发灵感 (一)打破刻板印象 (二)以古鉴今,探索人性与情感 二、角色分析与设定 (一)西门庆特质 (二&a…

我的深度学习笔记

传统观念认为:在不考虑算力的情况下,网络越深,其准确率就越高,最直接的方法就是把网络设计的越深越好。 事实上:随着网络的层数不断加深,当达到一定的书目之后,训练精度和测试精度都有下降&…