C语言实现json文本解析
C语言实现json文本解析
- 背景
- 总体方法
- 实现源码
- 相关资料
背景
项目中,有时需要根据外部输入条件,进行程序的灵活切换,运用JSON文件解析,能高效的替换指令行输入,且直观易懂。
总体方法
JSON文件准备
- JSON数据
- test_data.json
- 自写调度
- json_parser.c
- json_parser.h
- 库调用
- cJSON.c,下载链接:link
- cJSON.h,下载链接:link
DEMO思路
- 获取json文件大小,JsonGetFileSize
- 全部读入char字符数组,JsonConfigLoader
- 调用cJSON.c中的函数进行对象解析并输出打印,Parser
取自库调用作者的待解析的json数据文件:test_data.json
{"name": "Awesome 4K","resolutions": [{"width": 1280,"height": 720},{"width": 1920,"height": 1080},{"width": 3840,"height": 2160}]
}
注意读取第二个对象resolutions时,内部嵌套有列表需要先获取分辨率对象后,再用列表读取获取子列表项,最后再读取子列表项中的对象元素。
调用JsonPaserDemo函数,输出效果:
------------------------------- _ _____ ____ _ _| |/ ____|/ __ \| \ | || | (___ | | | | \| |_ | |\___ \| | | | \ |
| |__| |____) | |__| | |\ |\____/|_____/ \____/|_| \_|
-------------------------------
name is Awesome 4k
width=3840
height=2160
实现源码
文件:json_parser.h
#ifndef JSON_TEST_H
#define JSON_TEST_H#include "cJSON.h"#ifdef __cplusplus
extern "C" {#endifvoid JsonPaserDemo(void);#ifdef __cplusplus
}
#endif#endif
文件:json_parser.c
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "cJSON.h"
#include "json_parser.h"static void JsonBanner(void)
{char *banner = "\
------------------------------- \n\_ _____ ____ _ _ \n\| |/ ____|/ __ \\| \\ | | \n\| | (___ | | | | \\| | \n\_ | |\\___ \\| | | | \\ | \n\
| |__| |____) | |__| | |\\ | \n\\\____/|_____/ \\____/|_| \\_| \n\
------------------------------- \n";printf("%s", banner);
}static int JsonGetFileSize(FILE *fp)
{fseek(fp, 0, SEEK_END);int fsize = ftell(fp);return fsize;
}static void JsonConfigLoader(FILE *fp, char *data, int fsize)
{rewind(fp);fsize = fread(data, 1, fsize, fp);data[fsize] = '\0';return;
}static int Parser(char *data)
{int ret = 0;cJSON *json = cJSON_Parse(data);if (json == NULL) {return -1; // json malloc failed}cJSON *node = NULL;cJSON *subNode = NULL;cJSON *tmpNode = NULL;node = cJSON_GetObjectItem(json, "name");if(strcmp(node->valuestring, "Awesome 4K") == 0){printf("name is Awesome 4K\n");;} else {printf("name not Awesome 4K\n");}node = cJSON_GetObjectItem(json, "resolutions");int resMode = 2;subNode = cJSON_GetArrayItem(node, resMode);tmpNode = cJSON_GetObjectItem(subNode, "width");printf("width=%d\n", tmpNode->valueint);tmpNode = cJSON_GetObjectItem(subNode, "height");printf("height=%d\n", tmpNode->valueint);free(json);return ret;
}#define FILE_PATH "D:\\test_data.json"
void JsonPaserDemo(void)
{JsonBanner();FILE *fp = fopen(FILE_PATH, "rb");if (fp == NULL) {printf("file open failed\n");fclose(fp);}int fsize = JsonGetFileSize(fp);if (fsize < 0) {printf("size < 0\n");fclose(fp);return;}char *data = (char *)malloc((fsize + 1) * sizeof(char));if (data == NULL) {printf("malloc data failed\n");fclose(fp);free(data);data = NULL;return;}JsonConfigLoader(fp, data, fsize);int ret = Parser(data);if (ret != 0) {printf("ParserLoad failed, ret=%d\n", ret);fclose(fp);free(data);data = NULL;return;}fclose(fp);free(data);data = NULL;return;
}
相关资料
- cJSON使用说明,link
- figlet:ASCII 艺术字生成器,大字符大文字,link
C语言实现json文本解析相关推荐
- Go语言构建json和解析json实例
参考网址如下: https://www.cnblogs.com/fengbohello/p/4665883.html 转载于:https://www.cnblogs.com/forever521Lee ...
- JavaScript语言精粹JSON解析器源码阅读
1 // 这是一个用JavaScript编写JSON解析器的实现方案: 2 var jsonParser = (function() { 3 // 这是一个能把JSON文本解析成JavaScript数 ...
- Android json数据解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- go json部分解析_Go语言爱好者周刊:第 60 期 — 今天这题你做对了吗?
这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue . 鉴 ...
- c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)
在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...
- 易语言json置入_易语言取置JSON文本使用方法-易语言学习-猴子技术宅
什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON到底是什么? JSON就是一串字符串 只 ...
- Android开发--使用实体类解析JSON文本
Android开发–使用实体类解析JSON文本 在Android开发过程中,涉及到了API的调用的时候,会返回特定的数据,两个主流返回的数据格式是JSON形式和XML形式.但是相对于XML,JSON数 ...
- 解析json文本并使用handler完成三个控件文本内容的切换
Demo需求: 三个控件展示三个关键词,在资源文件获取文本,每隔5秒切换下一词,关键词展示到最后再重头开始 开发工具:Android studio 布局: <?xml version=" ...
- cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言
一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...
最新文章
- 他676分考上清华却没微信,看到他的手机后大家沉默了
- AI开放只是幌子?科技巨头边承诺开放边申请专利
- IntelliJ IDEA导入多个eclipse项目到同一个workspace下
- Visual Studio Code启动项目
- Springboot消除switch-case方法
- python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...
- LeetCode 1598. 文件夹操作日志搜集器
- 混迹职场,你的领导也是你的资源
- Cocoa教学:Windows OOP与Cocoa MVC之对比
- Vi的多文件间的复制和文本替换
- 1008 数组元素循环右移问题 (20 分)—PAT (Basic Level) Practice (中文)
- 算法:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
- 软件设计师历年真题(2016-2021)
- xjad一款不错的java反编译软件
- 邮件、社交营销最全“勾搭”策略
- yjv是电缆还是电线_yjv电缆中的yjv是什么意思?yjv与yjv22电缆区别有哪些?
- google glog 简单使用小结
- 企业微信机器人还能这么玩?
- android 获取移动网络,Android获取移动当前APP移动流量的方法
- 【华为OD机试真题 python】机房布局【2023 Q1 | 200分】