json格式与cJSON函数库

json的格式

  1. 键/值对 key:value,用半角冒号分割
  2. 文档对象 JSON对象写在花括号中,可以包含多个键/值对。
  3. 数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 { "stars":[ { "name":"Faye" ,"address":"北京" }, { "name":"andy" ,"address":"香港" }, { "name":"eddie","address":"台湾" }, ] }

json数组

  • char array[23] = " safasdfsdaf";
  • 中括号[整型,字符串,布尔类型,json数组,json对象],数据类型可以不一样

json对象

  • {}中是一些键值对
  • 例如:
	{ "name1": "zhang3" , "name2": "li4"  }
  • key值:必须是字符串,不重复,key值是搜索唯一的标识
  • value值:json对象,json数组,布尔,整型,字符串

json数组+json对象

{ "name1": "zhang3" , "name2": "li4" ,"张三" : { "别名" : "老王","性别" :  "男" ,"年龄" :  34,"孩子" :  ["小红","小绿","小黑"]} }

cJson结构体

/* cJSON Types: */
#define cJSON_Invalid (0)
#define cJSON_False  (1 << 0)
#define cJSON_True   (1 << 1)
#define cJSON_NULL   (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array  (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw    (1 << 7) /* raw json */#define cJSON_IsReference 256
#define cJSON_StringIsConst 512/* The cJSON structure: */
typedef struct cJSON
{/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */struct cJSON *next;struct cJSON *prev;/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */struct cJSON *child;/* The type of the item, as above. */int type;/* The item's string, if type==cJSON_String  and type == cJSON_Raw */char *valuestring;/* The item's number, if type==cJSON_Number */int valueint;/* The item's number, if type==cJSON_Number */double valuedouble;/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */char *string;
} cJSON;typedef struct cJSON_Hooks
{void *(*malloc_fn)(size_t sz);void (*free_fn)(void *ptr);
} cJSON_Hooks;

cjson

创建一个json对象

cJson * cJson_CreateObject(void);

往json对象中添加数据成员

void cJson_AddltemToObject(cJson *object,         //json对象cosnt char *string,	//key值cJson *item              //value值(int,string,array,obj)
);

从缓冲区中解析出JSON结构

extern cJSON *cJSON_Parse(const char *value);

解析一块JSON数据返回cJSON结构,在使用完之后调用cJSON_Delete函数释 放json对象结构

将传入的JSON结构转化为字符串

extern char  *cJSON_Print(cJSON *item); 

(可用于输出到输出设备),使用完之后free(char *);

  • 返回值需要free释放
  • FILE * fp=fopen();
  • fwrite();
  • fclose();

将JSON结构所占用的数据空间释放

void cJSON_Delete(cJSON *c)

创建一个值类型的数据

extern cJSON *cJSON_CreateNumber(double num); 
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);

创建一个对象(文档)

extern cJSON *cJSON_CreateObject(void);

数组创建以及添加

cJSON *cJSON_CreateIntArray(const int *numbers,int count); 
void cJSON_AddItemToArray(cJSON *array, cJSON *item);

json嵌套

向对象中增加键值对

cJSON_AddItemToObject(root, "rows", 值类型数据相关函数()); 

向对象中增加数组

cJSON_AddItemToObject(root, "rows", cJSON_CreateArray()); 

向数组中增加对象

cJSON_AddItemToArray(rows, cJSON_CreateObject());

解析json文件

将字符串解析为JSON结构

cJSON* cJSON_Parse(cosnt char * value);
//返回值需要使用cJSON_Delete释放

根据键值查找json结点

cJSON * cJSON_GetObjectltem(cJSON* object,   //当前json对象const char * string  //key值
);

获取json数组中元素的个数

int cJSON_GetArraySize(cJSON* array);

根据数组下标找到对应的数组元素

cJSON* cJSON_GetArrayltem(cJSON* attay,int index);

判断是否有可以值对应的键值对

int cJSON_HasObjectltem(cJSON* object,const char* string);

c语言调用cJSON函数库创建json文件

示例

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include"cJSON.h"  
int main(int argc,const char * argv[])
{//创建对象cJSON* obj = cJSON_CreateObject();//创建子对象cJSON* subObj = cJSON_CreateObject();//向子对象中添加键值对cJSON_AddItemToObject(subObj,"factory",cJSON_CreateString("一汽大众"));cJSON_AddItemToObject(subObj,"last",cJSON_CreateNumber(31));cJSON_AddItemToObject(subObj,"price",cJSON_CreateNumber(83));cJSON_AddItemToObject(subObj,"sell",cJSON_CreateNumber(49));cJSON_AddItemToObject(subObj,"sum",cJSON_CreateNumber(80));//创建json数组cJSON* array = cJSON_CreateArray();//array数组中添加元素cJSON_AddItemToArray(array,cJSON_CreateNumber(123));cJSON_AddItemToArray(array,cJSON_CreateBool(1));cJSON_AddItemToArray(array,cJSON_CreateString("hellow world"));//数组中的对象cJSON* subsub = cJSON_CreateObject();cJSON_AddItemToObject(subsub,"梅赛德斯奔驰",cJSON_CreateString("心所向,持以恒"));cJSON_AddItemToArray(array,subsub);cJSON_AddItemToObject(subObj,"other",array);//obj中添加key - valuecJSON_AddItemToObject(obj,"奔驰",subObj);//数据格式化char* data = cJSON_Print(obj);FILE* fp = fopen("car.json","w");fwrite(data,sizeof(char),strlen(data)+1,fp);fclose(fp);return 0;}                                    

在这里插入图片描述

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

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

相关文章

HTTP清晰的学习笔记

HTTP协议—应用层 请求消息(Request)—浏览器给服务器发 包含四部分 请求行&#xff1a;说明请求类型&#xff0c;要访问的资源&#xff0c;以及使用的http版本请求头&#xff1a;说明服务器要使用的附加信息,由键值对构成的空行&#xff1a;空行是必须要有的&#xff0c;即…

如何在 Centos7 x86_64下将vim一键配置为一款强大的C++,IDE

vim功能很强大&#xff0c;但是对于我这样的小白很不友好 然后就有一位大佬&#xff0c;为了辅助我这样的菜鸡&#xff0c;然后供我们一键搞定&#xff0c;在vim畅快编写代码的功能。 首先强烈不推荐在root用户下使用&#xff0c;确保电脑连着网。在普通用户下执行此命令 cur…

详解string容器(应用+模拟实现,string练习题)

为什么要有string容器 string&#xff1a;其实就是一个字符串,c对字符串进行了封装的&#xff0c;封装到一个类里面&#xff0c;这样用户就不用担心开辟空间的问题&#xff0c;只需要往string类里放字符串就可以了&#xff0c;string其实还可以自增长 很多人就会有一个疑问&am…

浅拷贝+引用计数--写时拷贝---模拟实现string容器

引用计数 深拷贝 多个对象共享同一份资源时&#xff0c;最后能够保证该资源只被释放一次 应该由哪个对象释放资源&#xff1f; 由最后一个使用该资源的对象去释放 怎么知道一个对象是最后一个使用该资源的对象&#xff1f; 给一个计数&#xff0c;记录使用该资源对象的个数 实…

详解vector容器(应用+模拟实现,vector相关练习题)

vector容器 动态的顺序表&#xff0c;数组。 vector操作 vector操作及其概念 构造 vector<int>v1;vector<int>v2(10, 5);vector<int>v3(v2);int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };vector<int>v4(array, array sizeof(array) / sizeof(a…

详解list容器(应用+模拟实现)

list容器 带头结点的双向循环链表 list操作 list容器的概念及其操作 构造和销毁 list<int>L1;list<int>L2(10, 5);vector<int>v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };list<int>L3(v.begin(), v.end());list<int>L4(L3);元素访问 cout << L3.…

vector和list容器有哪些区别

这个问题的本质还是在问顺序表和链表的区别 底层结构不同 vector容器list容器一段连续的空间带头结点的双向循环链表 元素访问方式 vector容器list容器支持随机访问—O(1)不支持随机访问—O(N)需要扩容不需要扩容任意位置插入元素----O(N)–搬移元素O(1) 迭代器不同 vector…

复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

栈和队列的概念 栈:吃进去吐出来 对列&#xff1a;吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性&#xff0c;而内存中的栈是一个内存空间&#xff0c;只不过这个内存空间具与数据结构的栈具有相同的特性。 栈和队列操作 栈和队列基本操作…

详解优先级队列priority_queue(应用+模拟实现)

优先级队列的概念 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元素(优先队列中位于顶部的元 素)。优先队列被实现为容…

私人博客定制

项目背景 可行性方面 需求分析&#xff1a; 详细设计&#xff1a; 数据库设计 博客管理API的设计 标签相关API 服务器端的实现 对数据库操作进行封装 对服务器操作进行封装 客户端实现 具体操作 使用markdown 具体实现 测试 项目效果展示 维护 完整代码 项目…

初识c++中的函数模板

函数模板 函数模板概念 函数模板:编译器生成代码的一个规则。函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定类型版本。 函数模板格式 //要让这个函数与类型无关 //Add函数模板 template…

深入理解c++中的函数模板

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使…

c++中的IO流

c语言中的IO操作 标准类型的输入输出: 输入------>数据来源是通过键盘进行输入输出------>程序中的数据输出到控制台 c语言中: scanf:输入 printf:输出 两个函数的相同点 1 —格式串 2 —不定参数 两个函数的缺陷 1 —用户要提供数据的格式—用户要记忆大量的格式串—…

201301 JAVA2~3级---走格子

请编写一个函数&#xff08;允许增加子函数&#xff09;&#xff0c;计算n x m的棋盘格子&#xff08;n为横向的格子数&#xff0c;m为竖向的格子数&#xff09;沿着各自边缘线从左上角走到右下角&#xff0c;总共有多少种走法&#xff0c;要求不能走回头路&#xff0c;即&…

复习Linux基本操作----常见指令

Linux基本操作 ls命令 ls(list):相当于windows上的文件资源管理器 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目…

复习Linux基础操作---权限操作

shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟…

【剑指offer】_01 (二维数组中的查找)

题目描述 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该…

再谈c++中的多态

何为多态 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 多态的实现 在继承的体系下 基类中必须有虚函数(被virtual关键字修饰的成员函数)&#xff0c;在派生类中必须…

再谈c++中的继承

继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体现了…

红黑树概念及其相关操作的实现

红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但它并不像AVL树一样&#xff0c;每个结点绑定一个平衡因子。但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c…