C语言之json库

什么是 JSON ?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式,是存储和交换文本信息的语法。类似 XML。
  • JSON 比 XML 更小、更快,更易解析。
  • JSON 具有自我描述性,更易理解
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON语法

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在键/值对中
  • 数据由逗号分隔
  • 中括号保存数组
  • 大括号保存对象
JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
cJSON库下载地址

因为整个库只有一个C文件和一个头文件,所以只需复制cJSON.h并复制cJSON.c到项目源。
从cJSON源码可以找到:(键值对即key,value)

/* cJSON 类型定义: /
#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 /
稍加翻译
/
cJSON 结构体: */
typedef struct cJSON
{
struct cJSON *next, *prev; //next/prev 遍历 数组或对象的前后指针. 或者使用GetArraySize/GetArrayItem/GetObjectItem
struct cJSON *child; // 当类型为Array或者Object指向第一个元素,否则=NULL
int type; // value的类型, 如上.
char *valuestring; // 当类型为String或者Raw时valued的字符串值 ,否则为NULL
int valueint;
double valuedouble; // 类型为Number时 valued的值。int valueint已经被弃用,建议使用cJSON_SetNumberValue函数来赋值,valuedouble也会被赋值
char *string; // key的字符串值.
} cJSON;

cJSON函数简介
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
将JSON字符串解析出cJSON结构体,返回该结构体的指针。
因为函数中开辟了JSON结构体的内存空间,所以使用完毕后需要调cJSON_Delete函数释放JSON结构体内存空间。

CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);删除一个cJSON实体和所有子实体

CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
将传入的JSON结构转化为带格式的字符串 。
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
将传入的JSON结构转化为无格式的字符串 。
因为函数中开辟了字符串的内存空间,所以使用完毕后需要调用cJSON_free或者free (cJSON_free调用的就是free)函数释放内存空间。

C语言函数库写JSON :

CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); // 创建一个数组
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); //创建一个对象(文档)
因为函数中开辟了JSON结构体的内存空间,所以使用完毕后需要调cJSON_Delete函数释放JSON结构体内存空间。

//创建一个值类型的数据
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);

//在对象中添加对应类型的键值对
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);

//在对象中添加对象,数组
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);

//在数组/对象中添加项
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
示例:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main()
{
    //创建一个老师json,转化为带格式的字符串并打印
    char * json_data = NULL;
    cJSON * teacher = NULL;
    teacher = cJSON_CreateObject();
    //cJSON_AddStringToObject(teacher,"name","laoshi1");
    cJSON_AddItemToObject(teacher,"name",cJSON_CreateString("laoshi1"));
    cJSON_AddNumberToObject(teacher,"age",32);
    cJSON_AddStringToObject(teacher,"subject","math");

    json_data = cJSON_Print(teacher);//每一次解析出json信息都会产生新的内存空间所以需要释放
    printf("json msg is  %s \n\n",json_data);
    free(json_data);

   //为老师添加一组学生
    cJSON * students = NULL;
    students = cJSON_CreateArray();

    cJSON  *student3 = NULL, *student4 = NULL, *student5 = NULL;

    student3 = cJSON_CreateObject();
    cJSON_AddStringToObject(student3,"name","student3");
    cJSON_AddNumberToObject(student3,"age",16);
    cJSON_AddNumberToObject(student3,"score",99);

    student4 = cJSON_CreateObject();
    cJSON_AddStringToObject(student4,"name","student4");
    cJSON_AddNumberToObject(student4,"age",16);
    cJSON_AddNumberToObject(student4,"score",87);

    student5 = cJSON_CreateObject();
    cJSON_AddStringToObject(student5,"name","student5");
    cJSON_AddNumberToObject(student5,"age",16);
    cJSON_AddNumberToObject(student5,"score",56);

    cJSON_AddItemToArray(students,student3);
    cJSON_AddItemToArray(students,student4);
    cJSON_AddItemToArray(students,student5);

    cJSON_AddItemToObject(teacher,"students",students);

    //json_data = cJSON_Print(teacher);//每一次解析出json信息都会产生新的内存空间所以需要释放
    json_data = cJSON_PrintUnformatted(teacher);//不带格式

    printf("json msg is  %s \n\n",json_data);
    free(json_data);
    cJSON_Delete(teacher);
    return 0;
}

C语言库函数解析JSON:

CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); // 根据键找json结点
   
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); // 判断是否有key是string的项 如果有返回1 否则返回0 (其实就是调用了上面的cJSON_GetObjectItem()函数)
   
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); //返回数组结点array中成员的个数

CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); // 根据数组下标index取array数组结点的第index个成员 返回该成员节点

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值