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;
}

相关资料


  1. cJSON使用说明,link
  2. figlet:ASCII 艺术字生成器,大字符大文字,link

C语言实现json文本解析相关推荐

  1. Go语言构建json和解析json实例

    参考网址如下: https://www.cnblogs.com/fengbohello/p/4665883.html 转载于:https://www.cnblogs.com/forever521Lee ...

  2. JavaScript语言精粹JSON解析器源码阅读

    1 // 这是一个用JavaScript编写JSON解析器的实现方案: 2 var jsonParser = (function() { 3 // 这是一个能把JSON文本解析成JavaScript数 ...

  3. Android json数据解析及简单例子

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  4. go json部分解析_Go语言爱好者周刊:第 60 期 — 今天这题你做对了吗?

    这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue . 鉴 ...

  5. c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)

    在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...

  6. 易语言json置入_易语言取置JSON文本使用方法-易语言学习-猴子技术宅

    什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON到底是什么? JSON就是一串字符串 只 ...

  7. Android开发--使用实体类解析JSON文本

    Android开发–使用实体类解析JSON文本 在Android开发过程中,涉及到了API的调用的时候,会返回特定的数据,两个主流返回的数据格式是JSON形式和XML形式.但是相对于XML,JSON数 ...

  8. 解析json文本并使用handler完成三个控件文本内容的切换

    Demo需求: 三个控件展示三个关键词,在资源文件获取文本,每隔5秒切换下一词,关键词展示到最后再重头开始 开发工具:Android studio 布局: <?xml version=" ...

  9. cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

    一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

最新文章

  1. 他676分考上清华却没微信,看到他的手机后大家沉默了
  2. AI开放只是幌子?科技巨头边承诺开放边申请专利
  3. IntelliJ IDEA导入多个eclipse项目到同一个workspace下
  4. Visual Studio Code启动项目
  5. Springboot消除switch-case方法
  6. python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...
  7. LeetCode 1598. 文件夹操作日志搜集器
  8. 混迹职场,你的领导也是你的资源
  9. Cocoa教学:Windows OOP与Cocoa MVC之对比
  10. Vi的多文件间的复制和文本替换
  11. 1008 数组元素循环右移问题 (20 分)—PAT (Basic Level) Practice (中文)
  12. 算法:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
  13. 软件设计师历年真题(2016-2021)
  14. xjad一款不错的java反编译软件
  15. 邮件、社交营销最全“勾搭”策略
  16. yjv是电缆还是电线_yjv电缆中的yjv是什么意思?yjv与yjv22电缆区别有哪些?
  17. google glog 简单使用小结
  18. 企业微信机器人还能这么玩?
  19. android 获取移动网络,Android获取移动当前APP移动流量的方法
  20. 【华为OD机试真题 python】机房布局【2023 Q1 | 200分】

热门文章

  1. 多线程写法 与老虎机的制作
  2. 使用tvp.player_v2_zepto.js播放腾讯视频
  3. 微信:item_search_seller - 搜索公众号列表
  4. Python语法--Mooc七月
  5. pyqt5 图片随窗口变化等比例缩放
  6. 新手如何成为一名黑客
  7. 三极管集电极和基集短接等效成二极管
  8. 微软混合现实设备HoloLens 2惊艳发布,售价2.4万人民币
  9. python数据分析的交叉分析和分组分析 -第三次笔记
  10. 小鸡小猪大历险java_小鸡和小猪