在C++中高效使用和处理Json格式数据的示例代码

 更新时间:2023年11月01日 09:53:02   作者:招财猫_Martin  
最近的项目在用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.

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

到此这篇关于在C++中高效使用和处理Json格式的数据的示例代码的文章就介绍到这了,更多相关C++使用和处理Json数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT中QDataStream二进制数据读写的实现

    QT中QDataStream二进制数据读写的实现

    本文主要介绍了QT中QDataStream二进制数据读写的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++实现String类实例代码

    C++实现String类实例代码

    这篇文章主要介绍了C++实现String类实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • C++超集C++/CLI模块的基本类型

    C++超集C++/CLI模块的基本类型

    这篇文章介绍了C++超集C++/CLI模块的基本类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 如何利用Matlab绘制出好看的火山图

    如何利用Matlab绘制出好看的火山图

    火山图是散点图的一种,它将统计测试中的统计显著性量度和变化幅度相结合,从而能够帮助快速直观地识别那些变化幅度较大且具有统计学意义的数据点。本文将通过Matlab绘制好看的火山图,需要的可以参考一下
    2022-03-03
  • c语言基于stdarg.h的可变参数函数的用法

    c语言基于stdarg.h的可变参数函数的用法

    本篇文章主要介绍了c语言基于stdarg.h的可变参数函数的用法,详细的介绍了可变参数函数的详细用法和源码实例,有兴趣的可以了解一下
    2017-07-07
  • 解析Linux下C++编译和链接

    解析Linux下C++编译和链接

    编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理。本文通过开发过程中碰到的四个典型问题来探索64位linux下C++编译&链接的那些事。
    2021-05-05
  • C++的get()函数与getline()函数使用详解

    C++的get()函数与getline()函数使用详解

    这篇文章主要介绍了C++的get()函数与getline()函数使用详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言由浅入深讲解文件的操作下篇

    C语言由浅入深讲解文件的操作下篇

    C语言具有操作文件的能力,比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。与其他编程语言相比,C语言文件操作的接口相当简单和易学
    2022-04-04
  • C语言实现简单登录操作

    C语言实现简单登录操作

    这篇文章主要为大家详细介绍了C语言实现简单登录操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++实现数组的排序/插入重新排序/以及逆置操作详解

    C++实现数组的排序/插入重新排序/以及逆置操作详解

    将新的数字与已经排序好的数组中的数字一一比较,直到找到插入点,然后将插入点以后的数字都向后移动一个单位(a[i+1]=a[i]),然后将数据插入即可
    2013-10-10

最新评论