当前位置: 首页 > news >正文

由浅入深C系列八:如何高效使用和处理Json格式的数据

如何高效使用和处理JSON格式的数据

  • 问题引入
  • 关于CJSON
  • 示例代码
    • 头文件引用
    • 处理数据

问题引入

最近的项目在用c处理后台的数据时,因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述,如何在c中高效使用和处理Json格式的数据就成为了必须要解决的问题。

关于CJSON

经常使用Java开发的同学可能觉得这个不是个问题,fastjson对于Json格式的数据处理提供了很好的支持。顺着这个思路往下走后,在Json的官网上发现推荐了好几个c的功能库。根据个人使用的情况,综合易于上手和对Json数据操作的便捷性来说,推荐cJSON: cJSON on Github

示例代码

头文件引用

cJson可以直接在使用的地方引用,如下面这样。

#include "../include/cJSON.h"
#include "../include/cJSON_Utils.h"

也可能编译成so文件,作为库来使用。

处理数据

cJSON *json = NULL;
cJSON *jdata = NULL;
cJSON *jlists = NULL;
cJSON *jlist = NULL;json = cJSON_Parse(resp->response); // 从项目接口中返回的Json格式的数据
if (json == NULL)
{// 解析失败的情况下进行错误处理。const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL){fprintf(stderr, "Error before: %s\n", error_ptr);}return OSMP_ERR;
}
// 获取对应的节点下的数据。我的项目中数据列表在{ data: { list: { xxx } } } 下。
// 可以seek到对应的节点下,获取到节点数据进行处理。
jdata = cJSON_GetObjectItemCaseSensitive(json, "data");
jlists = cJSON_GetObjectItemCaseSensitive(jdata, "list");// 循环处理列表中的每一条数据。
// cJson通过一个macro来组织循环处理列表中的处理。为了便于Java开发同学理解,相当于Java中的
// for(String item : arrayList ) {
//     System.out.println(item);
// } 
cJSON_ArrayForEach(jlist, jlists)
{cJSON *id = cJSON_GetObjectItemCaseSensitive(jlist, "id");cJSON *projectnum = cJSON_GetObjectItemCaseSensitive(jlist, "projectnum");cJSON *name = cJSON_GetObjectItemCaseSensitive(jlist, "name");cJSON *status = cJSON_GetObjectItemCaseSensitive(jlist, "status");cJSON *contractamount = cJSON_GetObjectItemCaseSensitive(jlist, "contractamount");cJSON *income = cJSON_GetObjectItemCaseSensitive(jlist, "income");cJSON *actualpayment = cJSON_GetObjectItemCaseSensitive(jlist, "actualpayment");cJSON *managerName = cJSON_GetObjectItemCaseSensitive(jlist, "managerName");cJSON *nextmilestone = cJSON_GetObjectItemCaseSensitive(jlist, "nextmilestone");cJSON *plancomplettime = cJSON_GetObjectItemCaseSensitive(jlist, "plancomplettime");cJSON *countdown = cJSON_GetObjectItemCaseSensitive(jlist, "countdown");// 组装sql进行后处理。char* sql = (char*)malloc(sizeof(char*)*10240);sprintf(sql, "insert into utmp_projectpageqrydetailinformation(id, projectnum, name ,status, contractamount, income, actualpayment, manager_name, nextmilestone, plancomplettime, countdown) values(%d, '%s', '%s', '%s', %d,  %d,  %d, '%s', '%s', '%s', '%s');", id->valueint, projectnum->valuestring, name->valuestring, status->valuestring, contractamount->valueint, income->valueint, actualpayment->valueint, managerName->valuestring, nextmilestone->valuestring, plancomplettime->valuestring, countdown->valuestring);
}
// 后续可以做一些资源清理操作,防止memory leak导致应用coredump.

如果有什么使用上的问题,欢迎留言一起讨论。:)

http://www.lryc.cn/news/211369.html

相关文章:

  • 多媒体应用设计师 第16章 多媒体应用系统的设计和实现示例
  • golang平滑重启库overseer实现原理
  • 用Python定义一个函数,用递归的方式模拟汉诺塔问题
  • 二手的需求
  • 大厂面试题-JVM为什么使用元空间替换了永久代?
  • 基本微信小程序的驾校宝典系统-驾照考试系统
  • 02、SpringCloud -- Redis和Cookie过期时间刷新功能
  • 【报错】kali安装ngrok报错解决办法(zsh: exec format error: ./ngrok)
  • <学习笔记>从零开始自学Python-之-常用库篇(十三)内置小型数据库shelve
  • Redis快速上手篇七(集群-六台虚拟机)
  • LeetCode 301. 删除无效的括号【字符串,回溯或BFS】困难
  • 面试经典159题——Day25
  • C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计
  • Windows环境下MosQuitto服务器搭建,安装mqtt服务端软件
  • web前端JS基础-----制作进度条
  • Linux命令解压多个tar.gz包
  • Java基于SpringBoot+Vue的网上图书商城管理系统(附源码,教程)
  • Visual Studio Code的下载与安装
  • 23种设计模式在SpringCloud源码里的应用
  • 几个精致的Linux命令
  • CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试
  • vscode下ssh免密登录linux服务器
  • 基于jquery+html开发的json格式校验工具
  • 【面试经典150 | 栈】最小栈
  • Linux网络基础2 -- 应用层相关
  • 【Python机器学习】零基础掌握SkewedChi2Sampler内核近似特征
  • Unity Meta Quest 一体机开发(三):Oculus Integration 基本原理、概念与结构+玩家角色基本配置
  • excel 拼接字符 单元格
  • HarmonyOS 快速入门TypeScript
  • ChatGPT扩展系列之ChatExcel