C语言json解释器。包含json文本文件解析和生成,占用空间小、安全高效、简洁灵活,能无差别或者小修改移植到大部分的C语言平台。
测试代码
测试代码
打印结果
json语法是JavaScript对象表示语法的子集。
键值对书写方式
其中键的类型为字符串类型,需要用双引号""括住。 而值可以是以下基本类型的任意一种
在json语法当中,数据以键值对的形式存储(在数组中存储时,没有键)。 在此json解析器中,存储的最小单元,也是唯一的存储单元为上面指示的JSON结构体,而在此结构体一共包含了4个成员,*next指针、info、*key(隐式成员)、value(隐式成员),其中的键值对为隐式成员,因为并不是所有的JSON对象都需要键(比如数组的对象),值也不是固定类型的成员,类型可以根据info信息配置为int、double、*char等类型。采用这种隐式的结构体成员的方式,可以大大的节省空间。
JSON结构体为唯一的存储单元,在存储结构上以单向链表的形式进行存储和维护。
info成员位int型,低八位存储json对象的基本类型(null、bool、数字、字符串、数组、对象),第9位存储bool类型的值(当基本类型为bool型时起效,1为true,0为false),第10位存储数字整型标志(当基本类型为数字型起效,1为整型,0为浮点型),第10位标记此json对象是否有键(1为有键,0为无键),其余位保留。 info成员的信息,会决定创建json对象时候,隐式参数是否创建,比如JSON_WITH_KEY位起效的话,则创建时候预留char* key的空间,比如根据不同的基本类型决定隐式参数value的类型(为int、double、char*、json_t的哪一个,或者没有value)。
key成员为隐式不定的,根据实际存储类型而决定有没有,key为字符串,不具备去重,也就是同一级的json对象可以存在相同的key,具体访问到哪个key,就得取决于查找的方式,本json解析器采用单向链表的存储结构,访问会访问到同名的第一个对象。
value成员为隐式不定的,根据info的基本类型来决定在结构体尾部追加相应类型所需的空间,比如整型,则在后面追加**sizeof(int)**大小的空间存储整型数据。
方法原型
json_loads函数传进json文本信息,则可以返回解析出来的json对象句柄。 json_file_load函数则是直接传入文件名即可加载文件返回json对象,函数内部通过C语言标准文件操作函数集对文件进行读取,然后套用json_loads函数进行解析,支持utf8编码文件。
方法原型
json_dumps函数将json对象转换成文本信息,其中preset为预置的文本长度,预置的长度和最终输出文本长度接近则可以减小内存重分配的次数而提高转换效率;unformat是否不采用格式化输出,不采用格式化则文本会挤在一行;len是转换的输出长度。json_file_dump函数套用了json_dumps函数将文本信息存储到指定名字的文件。
方法原型
在json对象中,key是不具备查重的,也就是在同一个层级的json中,可能存在多个同名的key,json_get_child方法则是可以用于匹配特定的key。此函数,当key传入NULL时,则只有index起作用,按照索引来匹配子对象,当key不为NULL的时候,则只会匹配相应key的子对象,并通过index来指示匹配第几个名为key的对象。
json_to_index和json_to_key这两个方法都可以很方便的获取到子对象,同时可以当做查找方法查找是否存在相应的子对象。json_to_index方法通过索引的方式去获取子对象,不管对象类型是数组的还是对象的,此方法都能使用。json_to_key方法通过键的方式去获取子对象,但是此方法只适用于是对象类型的对象,因为数组没有键。 这两个方法的参数都带有了不定参数,这个不定参数可以输入若干个索引或者键去连续获取下个层级的子对象。如下例子:
等同
方法原型
方法原型
在获取值对值操作之前,建议先判断一下是不是期待的类型,如果操作不对的类型,可能破坏json的存储结构甚至导致程序奔溃。
方法原型
此类方法可以创建json的基本类型,数组和对象又可以存储json对象,所以默认都创建为空的数组和空的对象,除了这两个,其他方法都可以在创建时候指定初始化值。 创建对象指定了key,如果传入key则创建出来的对象可以添加到对象类型中,如果传入空则创建出来的对象可以添加到数组类型中。 数组可以存储任意类型的数据,但是一般都是存储同种类型的数据,因此数组的创建方法额外提供了初始化的方法。
按照C语言数组,初始化数据到json数组。
方法原型
删除json自身及其所有展开子对象。json需要是独立的,也就是只能是根节点。
方法原型
json_attach方法是将创建后的对象按照索引链结到另一个对象中,而被链结的对象其值类型必须为数组型或者对象型才可以。成功返回item自身,失败则是NULL。json_detach方法是将数组或者对象中,按照json_get_child同样的key和index配合匹配逻辑,将指定的子对象断链出来,返回其子对象,失败则返回NULL。 这两个方法都不涉及对象的创建或者删除,只是存储结构的调整,通过配合其他方法实现添加或者移除的操作。 而插入的索引,除了插到指定索引中,还可以指定常用的头插和尾插。
这些方法是通过创建方法和链结方法配合而成,将特定类型的数据添加到array或者object型的json对象中。
这些方法是通过删除方法和断链方法配合而成,移除array或者object中特定的子对象。
方法原型
如果数值类型不是数组和对象时候,可以根据当前是什么类型而调用相应的set方法进行直接的修改。但是,当原始类型与修改类型不一致时候,则需要通过其上一级对象调用replace方法进行修改。
这个方法是无法用set方法进行修改时的后备方法。通过父级,匹配子对象,将匹配的子对象用新的对象去替换。
方法原型
根据源json对象深拷贝出一份json对象
方法原型
C语言在嵌入式应用普遍,针对不同嵌入式平台,内存分配和释放函数都是一样的接口,此方法可以根据不同平台设置相应的内存钩子函数,默认已经使用了标准的分配和释放函数。json_set_hooks必须指定配套malloc和free,realloc没有的话可以不指定(json内置通过malloc和free模拟realloc),否则设置失败。
方法原型
此json解析器具备较为精准的报错机制,在执行json_loads类加载函数时候,返回空值表明解析出错时候则可以调用json_error_info方法来查看具体的错误信息,json_file_load函数内部已经输出错误信息。 参数中,*line为输出的错误行;*column为输出的错误列,返回值则为错误类型。
如下例子,在false前面多了一个负号的错误
加载此文件出现一下报错,表明了第2行第15列在false附近出现了值类型的错误
错误类型包含以下几种
仓库链接 如果喜欢希望点赞支持,如有bug或者好的建议欢迎留言交流。
1. 如何生成一个巨大的序列1.1 需求描述要求生成一个包含很多元素的序列,假设:存储 1 个整数需要 4 个字节现在要创建一个包含 1 G 个整数的序列,从 0 到 1 * 1024 * 1024 * 1024 - 1如果需要为序列中的每个整数分配内存,则需要分配的内存为 1G * 4 = 4G1.2 通过列表推导Python 提供了列表推导用于生成列表,下面使用列表推导生成一个包含 0 到 4
鸿蒙低代码可视化开发神器快速对鸿蒙ArkUI生成源码,结合类似小程序类似设计,页面设计底部菜单,支持宫格组件、轮播图、图文列表、图片组件、文本内容组件,快速对接第三方HttpApi。通过鸿蒙扩展axios扩展库加载数据源,在线API调试请求数据源、绑定数据源、生成源码。在线的API源码快速生成TS接口实现。
在Python编程中,生成器是一种强大的工具,它允许你按需生成值,而不需要一次性将所有值加载到内存中。通过生成器,你可以高效地处理大数据集、实现惰性求值(Lazy Evaluation)以及创建无限序列。本文将带领你深入理解Python生成器的基础、进阶用法以及它们在实际开发中的应用。
文章目录一、Json 生成器 JsonBuilder二、Xml 生成器 MarkupBuilder三、Swing 生成器 SwingBuilder一、Json 生成器 JsonBuilderJsonBuilder 原型如下 , 该类继承自 GroovyObjectSupport 类 , 其核心是 invokeMethod , 利用元编程实现 Json 生成器的作用 ,
# Android JSON生成器实现指南## 一、整体流程首先,让我们来看一下实现Android JSON生成器的整体流程。以下是一个简要的步骤表格:| 步骤 | 描述 || ------ | ----------- || 步骤一 | 创建一个Android项目 || 步骤二 | 添加UI控件,用于输入JSON数据 || 步骤三 | 实现JSON生成逻辑 || 步骤四 |
# Java Model生成JSON的方法及在线工具随着互联网的发展,前后端分离的开发模式越来越流行。在前后端分离的开发中,前端通常需要与后端进行数据交互,而JSON(JavaScript Object Notation)是一种常用的数据格式。因此,将Java Model转换为JSON数据是开发过程中常见的需求。本文将介绍在Java中生成JSON的方法,并推荐一个在线工具,可帮助您快速完成
# MySQL 在线生成器开发指南作为一名刚入行的小白,创建一个MySQL在线生成器的项目可能看起来有些复杂,但只要将整个过程分解成若干简单的步骤,并逐步实现,就会变得容易许多。本文将详细指导你如何创建一个基本的MySQL在线生成器。## 项目流程下面是整个项目开发的流程概述:| 步骤 | 描述 || :--- | :--- || 1 | 环境准备 || 2 |
探索 DreamJS:新一代 JSON 数据生成器在数字化世界中,数据生成是开发和测试的重要环节。这就是为什么我们想要向您推荐一个轻量级的 JSON 数据生成库——DreamJS。它不仅可以输出符合标准类型的随机数据,还内置了60多种自定义类型,涵盖从姓名、年龄到地址、单词等多样化需求。项目介绍DreamJS 是由 Adler Oliveira 创建的一个简洁且功能强大的工具,它可以基于 JSON
近期项目用到了json规范来实现数据传递,但是由于c++没有反射功能,在使用json的时候,无法做到定义class,则能自动生成对象转json字符串和json字符串反序列化为对象的功能。每次新增对象,或者修改字段,都必须手动修改c++代码,这样的搬砖非常苦恼。顾想设计一个自动生成对象和json代码的工具。思路如下图: 一、设计c++对象和json相互转换的基类接口: 通过该基类,可以实现对象、ma
有关于ios中开开发数据对 获取以及网络方面的知识,我们知道一般都是有AFNetworking来发送请求。这里面的类我们可以使用cocoaPod来进行获取,Afnetworking库:就是一个网络发送请求的库,通过这个库可以获取网络上的请求相关的资源,我们可以查看里面的文档。(不详讲)jsonModel:就是一个获取数据之后,用来存储json数据的一中处理数据的格式库,他们实现了对象的直接传值,有
什么是cron表达式: cron表达式主要是用在Quartz框架中,Quartz是一个完全由java编写的开源作业调度框架,最主要的功能就是调度器(完成定时任务),可以与javaEE或者javaSE应用程序相结合也可以单独使用,能借助关系数据库和JDBC作业存储支持集群,负载均衡。 CronTrig
此小工具是我突发奇想想的一个密码加密算法, 通过对一个小数的幂指数的不断迭代运算, 可以取得完全打乱字符排列的效果, 用户只要略微更改这密码初值,密码模板,计算指数中的任何一个, 所运算的结果都千差万别,毫无规律。该小工具完全采用原生js编写,方便用户更改代码, 没有应用任何外部资源, 完全可以断网使用。<!DOCTYPE html><html><head>
生成器迭代器生成器生成器概念生成器创建方法一:列表生成器创建方法二:带有yield的函数示例一:斐波那契数列示例二:杨辉三角总结迭代器迭代器概念迭代器创建总结 生成器生成器概念通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
不是题解不是教学!!! 11.10 CSES 1192 给定一个 \(01\) 网格图,求 \(0\) 的连通块个数。 遍历整个图,当遇到 \(0\) 时搜索并把联通的全部变为 \(1\),连通块数量加一。 CSES 1193 给定一个 \(01\) 网格图,问是否可以仅经过 \(0\) 从 \(A ...
UML是由视图(View)、图(Diagrams)、模型元素(Model elements)是和通用机制等几个部分构成。视图:视图是对系统的抽象表示,UML共有9种不同的图类型。模型元素:代表面向对象中的类、对象、消息和关系等概念。通用机制:用于表示其他信息,比如注释、模型元素的语义等。它还提供扩展机制,使UML语言能够适应一个特殊的方法(或过程)、或扩充至一个组织或用户。事物绘制方式:UML类:
在深度学习的实践中,优化算法是提升模型性能的关键环节。梯度下降作为最基础的优化方法,其效率直接决定了训练速度与模型收敛性。当面对大规模数据集时,传统批量梯度下降(Batch Gradient Descent, BGD)的计算成本极高,而随机梯度下降(Stochastic Gradient Desce ...
身为开发人员懂得网络结构层次划分是必须的,但是由于工作中不太经常用到所以在学校学的通信网络相关的知识全部还给老师了刚刚在上看了一下网络分成结构的通俗解释,感觉更加便于理解和记忆,下面就本人的理解简单的记录一下学习任何东西都要“知其然知其所以然“”才能真正的理解和应用——下面就几个问题去理解网络分层1、为什么需要网络分层2、如何进行网络分层3、怎样使用网络分层假如多台机器交流进行通信,我们需要定义一