使用cJSON解析JSON字符串

C语言:使用cJSON库解析JSON字符串 一、解析简单的JSON字符串 二、解析嵌套数组的JSON字符串 三、解析嵌套对象的JSON格式 阅读详情
  1. 解析JSON格式
    还是在Linux下,使用C语言编程,先实现读文件的功能,然后开始JSON字符串的解析。我们还是一步步来,先从简单的开始,万丈高楼起于平地嘛。
    1,下载源码;
    可以从如下网站来下载:https://sourceforge.net/projects/cjson/ 。
    2,包含cJSON的源码;
    下载下来,解压后,从里面找到两个文件(cJSON.c、cJSON.h),复制到我们的工程里面。只需在函数中包含头文件(#include “cJSON.h”),然后和cJSON.c一起编译即可使用。
    3,解析一个键值对;
    首先是一个简单的键值对字符串,要解析的目标如下:
    {“firstName”:”Brett”}
    要进行解析,也就是要分别获取到键与值的内容。我们很容易就能看出键为firstName,值为Brett,可是,使用cJSON怎么解析呢?
    对于这个简单的例子,只需要调用cJSON的三个接口函数就可以实现解析了,这三个函数的原型如下:
    cJSON*cJSON_Parse(const char *value);
    cJSON*cJSON_GetObjectItem(cJSON *object,const char *string);
    voidcJSON_Delete(cJSON *c);
    下面按解析过程来描述一次:
    (1) 首先调用cJSON_Parse()函数,解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc()函数在内存中开辟一个空间,使用完成需要手动释放。
    cJSON*root=cJSON_Parse(json_string);
    (2) 调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
    cJSON*item=cJSON_GetObjectItem(root,”firstName”);
    (3) 如果需要使用cJSON结构体中的内容,可通过cJSON结构体中的valueint和valuestring取出有价值的内容(即键的值)
    本例子中,我们直接访问 item->valuestring 就获取到 “Brett” 的内容了。
    (4) 通过cJSON_Delete(),释放cJSON_Parse()分配出来的内存空间。
    cJSON_Delete(root);
    这样就完成了一次cJSON接口调用,实现了解析工作。使用起来其实也很简单的啊,呵呵。
    4,解析一个结构体;
    接下来,我们来个复杂一点的,解析一个结构体,要解析的目标如下:
    {
    “person”:
    {
    “firstName”:”z”,
    “lastName”:”jadena”,
    “email”:”jadena@126.com”,
    “age”:8,
    “height”:1.17
    }
    }
    看起来比一个键值对复杂多了,我们又需要学习新的接口函数了吗?
    答案是不需要!
    还是那三个函数就可以了。当然,解析的步骤要复杂一些了,下面我按解析过程来描述一次:
    (1)根据JSON串中的对象,我们定义一个相应的结构体如下:
    typedefstruct
    {
    char firstName[32];
    char lastName[32];
    char email[64];
    int age;
    float height;
    } PERSON;
    具体的对应关系,一目了然,我就不罗嗦了。让我们直奔主题,解析!
    (2)还是调用cJSON_Parse()函数,解析JSON数据包。
    cJSON*root=cJSON_Parse(json_string);
    (3)调用一次cJSON_GetObjectItem()函数,获取到对象person。
    cJSON *object=cJSON_GetObjectItem(root,”person”);
    (4)对我们刚取出来的对象person,多次调用cJSON_GetObjectItem()函数,来获取对象的成员。此时要注意,不同的成员,访问的方法不一样:
    cJSON*item;
    PERSONperson;
    item=cJSON_GetObjectItem(object,”firstName”);
    memcpy(person.firstName,item->valuestring,strlen(item->valuestring));
    item=cJSON_GetObjectItem(object,”lastName”);
    memcpy(person.lastName,item->valuestring,strlen(item->valuestring));
    item=cJSON_GetObjectItem(object,”email”);
    memcpy(person.email,item->valuestring,strlen(item->valuestring));
    item=cJSON_GetObjectItem(object,”age”);
    person.age=item->valueint;
    item=cJSON_GetObjectItem(object,”height”);
    person.height=item->valuedouble;
    这样,就获取到了对象的全部内容了。
    (5) 通过cJSON_Delete(),释放cJSON_Parse()分配出来的内存空间。
    cJSON_Delete(root);
    至此,我们就使用cJSON接口完成了基于结构体的解析工作。
    5,解析结构体数组的JSON串;
    最后,我们来个更复杂一些的,来解析一个数组,并且数组的成员是结构体!要解析的JSON串如下:
    {
    “people”:[
    {“firstName”:”z”,”lastName”:”Jason”,”email”:”bbbb@126.com”,”height”:1.67},
    {“lastName”:”jadena”,”email”:”jadena@126.com”,”age”:8,”height”:1.17},
    {“email”:”cccc@126.com”,”firstName”:”z”,”lastName”:”Juliet”,”age”:36,”height”:1.55}
    ]
    }
    此时,我们真的又需要学习新的接口了,一个是获取数组长度,一个是取数组成员,函数原型如下:
    int cJSON_GetArraySize(cJSON *array);
    cJSON*cJSON_GetArrayItem(cJSON *array,int item);
    由于前面已经实现了结构体的解析,这里我们只需要关注下数组的相关调用即可。
    (1)调用cJSON_Parse()函数,解析JSON数据包。
    (2)调用一次cJSON_GetObjectItem()函数,获取到数组people。
    (3)对我们刚取出来的数组people,调用cJSON_GetArraySize()函数,来获取数组中对象的个数。然后,多次调用cJSON_GetArrayItem()函数,逐个读取数组中对象的内容。
    (4)通过cJSON_Delete(),释放cJSON_Parse()分配出来的内存空间。
    这样,我们就使用cJSON接口完成了结构体数组的解析工作。
    详细代码见后文附带例程。
    说明:
    本文所附带例程,实现了结构体数组的解析,只是一个学习之作,对于初学JSON使用cJSON接口的同学,可以有些借鉴参考的作用。

附带例程:

    [cpp]
#include <stdio.h>  
#include <string.h>  
#include <sys/types.h>  
#include <stdlib.h>  
#include <unistd.h>  

#include "cJSON.h"  

typedef struct  
{  
    int id;  
    char firstName[32];  
    char lastName[32];  
    char email[64];  
    int age;  
    float height;  
}people;  

void dofile(char *filename);/* Read a file, parse, render back, etc. */  

int main(int argc, char **argv)  
{  

//  dofile("json_str1.txt");  
//  dofile("json_str2.txt");  
    dofile("json_str3.txt");  

    return 0;  
}  

//parse a key-value pair  
int cJSON_to_str(char *json_string, char *str_val)  
{  
    cJSON *root=cJSON_Parse(json_string);  
    if (!root)  
    {  
        printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
        return -1;  
    }  
    else  
    {  
        cJSON *item=cJSON_GetObjectItem(root,"firstName");  
        if(item!=NULL)  
        {  
            printf("cJSON_GetObjectItem: type=%d, key is %s, value is %s\n",item->type,item->string,item->valuestring);  
            memcpy(str_val,item->valuestring,strlen(item->valuestring));  
        }  
        cJSON_Delete(root);  
    }  
    return 0;  
}  

//parse a object to struct  
int cJSON_to_struct(char *json_string, people *person)  
{  
    cJSON *item;  
    cJSON *root=cJSON_Parse(json_string);  
    if (!root)  
    {  
        printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
        return -1;  
    }  
    else  
    {  
        cJSON *object=cJSON_GetObjectItem(root,"person");  
        if(object==NULL)  
        {  
            printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
            cJSON_Delete(root);  
            return -1;  
        }  
        printf("cJSON_GetObjectItem: type=%d, key is %s, value is %s\n",object->type,object->string,object->valuestring);  

        if(object!=NULL)  
        {  
            item=cJSON_GetObjectItem(object,"firstName");  
            if(item!=NULL)  
            {  
                printf("cJSON_GetObjectItem: type=%d, string is %s, valuestring=%s\n",item->type,item->string,item->valuestring);  
                memcpy(person->firstName,item->valuestring,strlen(item->valuestring));  
            }  

            item=cJSON_GetObjectItem(object,"lastName");  
            if(item!=NULL)  
            {  
                printf("cJSON_GetObjectItem: type=%d, string is %s, valuestring=%s\n",item->type,item->string,item->valuestring);  
                memcpy(person->lastName,item->valuestring,strlen(item->valuestring));  
            }  

            item=cJSON_GetObjectItem(object,"email");  
            if(item!=NULL)  
            {  
                printf("cJSON_GetObjectItem: type=%d, string is %s, valuestring=%s\n",item->type,item->string,item->valuestring);  
                memcpy(person->email,item->valuestring,strlen(item->valuestring));  
            }  

            item=cJSON_GetObjectItem(object,"age");  
            if(item!=NULL)  
            {  
                printf("cJSON_GetObjectItem: type=%d, string is %s, valueint=%d\n",item->type,item->string,item->valueint);  
                person->age=item->valueint;  
            }  
            else  
            {  
                printf("cJSON_GetObjectItem: get age failed\n");  
            }  

            item=cJSON_GetObjectItem(object,"height");  
            if(item!=NULL)  
            {  
                printf("cJSON_GetObjectItem: type=%d, string is %s, valuedouble=%f\n",item->type,item->string,item->valuedouble);  
                person->height=item->valuedouble;  
            }  
        }  

        cJSON_Delete(root);  
    }  
    return 0;  
}  

//parse a struct array  
int cJSON_to_struct_array(char *text, people worker[])  
{  
    cJSON *json,*arrayItem,*item,*object;  
    int i;  

    json=cJSON_Parse(text);  
    if (!json)  
    {  
        printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
    }  
    else  
    {  
        arrayItem=cJSON_GetObjectItem(json,"people");  
        if(arrayItem!=NULL)  
        {  
            int size=cJSON_GetArraySize(arrayItem);  
            printf("cJSON_GetArraySize: size=%d\n",size);  

            for(i=0;i<size;i++)  
            {  
                printf("i=%d\n",i);  
                object=cJSON_GetArrayItem(arrayItem,i);  

                item=cJSON_GetObjectItem(object,"firstName");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, string is %s\n",item->type,item->string);  
                    memcpy(worker[i].firstName,item->valuestring,strlen(item->valuestring));  
                }  

                item=cJSON_GetObjectItem(object,"lastName");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, string is %s, valuestring=%s\n",item->type,item->string,item->valuestring);  
                    memcpy(worker[i].lastName,item->valuestring,strlen(item->valuestring));  
                }  

                item=cJSON_GetObjectItem(object,"email");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, string is %s, valuestring=%s\n",item->type,item->string,item->valuestring);  
                    memcpy(worker[i].email,item->valuestring,strlen(item->valuestring));  
                }  

                item=cJSON_GetObjectItem(object,"age");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, string is %s, valueint=%d\n",item->type,item->string,item->valueint);  
                    worker[i].age=item->valueint;  
                }  
                else  
                {  
                    printf("cJSON_GetObjectItem: get age failed\n");  
                }  

                item=cJSON_GetObjectItem(object,"height");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, string is %s, value=%f\n",item->type,item->string,item->valuedouble);  
                    worker[i].height=item->valuedouble;  
                }  
            }  
        }  

        for(i=0;i<3;i++)  
        {  
            printf("i=%d, firstName=%s,lastName=%s,email=%s,age=%d,height=%f\n",  
                    i,  
                    worker[i].firstName,  
                    worker[i].lastName,  
                    worker[i].email,  
                    worker[i].age,  
                    worker[i].height);  
        }  

        cJSON_Delete(json);  
    }  
    return 0;  
}  

// Read a file, parse, render back, etc.  
void dofile(char *filename)  
{  
    FILE *f;  
    int len;  
    char *data;  

    f=fopen(filename,"rb");  
    fseek(f,0,SEEK_END);  
    len=ftell(f);  
    fseek(f,0,SEEK_SET);  
    data=(char*)malloc(len+1);  
    fread(data,1,len,f);  
    fclose(f);  

    printf("read file %s complete, len=%d.\n",filename,len);  

//  char str_name[40];  
//  int ret = cJSON_to_str(data, str_name);  

//  people person;  
//  int ret = cJSON_to_struct(data, &person);  

    people worker[3]={{0}};  
    cJSON_to_struct_array(data, worker);  

    free(data);  
}  
Python图像处理之光斑分析 光斑是工程中经常出现的图像数据,其特点是目标明确,分布清晰。对光斑图像的分析,主要包括质心定位、目标截取以及半径拟合等。 阅读详情

相关推荐

ASME B31.3-2024工艺管道标准介绍

ASME B31.3-2024《过程管道》是ASME发布的最新版工业管道标准,适用于石油、化工、制药等行业的管道系统设计、建造和维护。该版标准进行了多项重要更新,包括软管管理、应力指数调整、新增管件类型、焊接检查和泄漏测试等条款修订,并新增了书面报告要求。标准共594页,为全球过程工业提供管道安全规范,对保障管道系统完整性、可靠性具有重要意义,被多国强制采用或推荐使用。

TXNMG的博客 4719

使用cJSON库解析JSON字符串

一、四个常用的cJSON函数: 1 cJSON *cJSON_Parse(const char *value); 作用:将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体 返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL 2 cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); 作用:获取JSON字符串字段值 返回值:成功返回一个指向cJSON类型的结构

baidu_39594043的博客 2776

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式 方法二】

关于荣耀手机安卓12如何解除进程限制,这里提供以下教程供小伙伴们参考。

Amy_mumu的博客 13万+

json解析字符串-第2讲

如下是一个例子,讲解怎么样解析一串字符串类型的 JSON 数据,然后,提取每一个 JSON 节点的数据;

LC的专栏 1350

【VAX 小番茄安装详细步骤】

本文详细介绍了在VS2022环境下安装Visual Assist X(番茄助手)的步骤及常见问题解决方案。主要内容包括:安装前的兼容性设置(需修改为Windows7兼容模式)、安装流程(卸载旧版本、勾选对应VS版本、替换关键dll文件)以及常见问题处理(如安装失败、工具栏图标缺失等)。文章提供了完整的下载链接和操作截图,特别强调了安装失败后的清理方法(注册表、安装目录和残余文件删除)。最后给出了安装成功后的测试运行指引。

qq_23962581的博客 1718

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 734

JSON:浅谈JSON的三种解析方式

JSON是一种取代XML的数据结构,和XML相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。JSON就是一串字符串 只不过元素会使用特定的符号标注。a.{} 双括号表示对象b.[] 中括号表示数组c."" 双引号内是属性或值d.: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象){"name": "Michael"} 可以理解为是一个包含name为Michael的对象。

王小二(海阔天空) 1万+

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 937

使用cJson进行解析和生成json字符串

如果需要交叉编译得到指定编译工具链生成的库,需要在CMakeLists.txt中指定使用的编译工具,增加例如下面的语句。JSON中的对象是一组键值对的集合(类似结构体),每个键值对都用逗号分隔,值书写在。JSON中的数组是一组有序的值的集合,每个值都用逗号分隔,简单的如。目录下生成动态库文件,如果还想生成静态库文件,请将上面第3行改为。这种情况下的,需要把库文件放到程序能访问到的路径,并在程序中加载。,复杂的比如每个元素又是一个json对象。的值可以存放在下面的json中。解析数组,简单的比如解析。

shirinngunn的博客 1627

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

使用OpenGL加载和显示DXF格式的3D模型文件编程

这样,我们就完成了使用OpenGL加载和显示DXF格式的3D模型文件的编程。通过实现加载函数和绘制回调函数,我们能够读取DXF文件的数据并使用OpenGL绘制出来。请注意,这只是一个简单的例子,仅涵盖了基本的加载和显示功能。在本文中,我们将探讨如何使用OpenGL编程加载和显示DXF(Drawing Exchange Format)格式的3D模型文件。DXF是一种通用的CAD(计算机辅助设计)文件格式,常用于存储和交换2D和3D图形数据。使用OpenGL加载和显示DXF格式的3D模型文件编程。

2301_79331421的博客 413

c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符

为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更好!且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件包含进来就可以使用了!cJSON使用数据...

weixin_34015347的博客 2029

使用静态库在嵌入式系统中进行开发

静态库是一种包含预编译对象代码的文件,它可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。静态库是包含预编译对象代码的文件,可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。的静态库文件,可以在嵌入式系统的应用程序中使用它了。

ZrElixir的博客 205

cjson构建_使用cJSON库解析和构建JSON字符串

使用cJSON库解析和构建JSON字符串前言其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON:当时在MCU平台上使用时,会出现时间长了死机的情况,在调用cJSON_Print输出格式化后的JSON数据之后,LOG("JSON数据:\n%s\n", cJSON_Print(root));要使用cJSON_Delete释放内存,否则会导致内存泄漏。cJSON_Delete(...

weixin_39924584的博客 431

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[转]使用cJSON解析JSON字符串

转自:http://blog.youkuaiyun.com/lintax/article/details/50993958 JSON学习-使用cJSON解析    使用cJSON解析JSON字符串   一、为何选择cJSON           我们在使用JSON格式时,如果只是处理简单的协议,可以依据JSON格式,通过对字符串的操作来进行解析与创建。然而随着协议逐渐复杂起来,经常会遇到一些未

CoCo的专栏 3225

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言解析JSON字符串指南(含结构体、结构体数组+使用cJSON)

如何将JSON解析成值、结构体、结构体数组等

kivenx的博客 3356

STM32使用cJSON解析JSON字符串

STM32使用cJSON解析JSON字符串 去发现同类优质开源项目:https://gitcode.com/ 资源文件介绍 本仓库提供了一个名为 stm32使用cjson解析json字符串.zip 的资源文件,该文件包含了在STM32平台上利用cJSON库解析和生成JSON格式数据的完整工程。该工程已经经过验证,可以直接在项目中使用。 资源文件内容 STM32工程文件:包含了所有必要的源代码和配...

gitblog_09752的博客 637

c/c++使用cJson解析未知内容的json字符串

关于json我这里就不做缀饰,这里给出链接百度百科json 我这里只介绍下json中的符号格式 ① { } : 双括号表示一个json对象。例如:{"name":"ljl"},这代表一个name为ljl的对象 ②[ ] : 中括号表示数组。例如:[{"name","ljl"},{"memory","ljx"}],表示包含两个对象的数组 ③ :   :冒号表示后者是前者的值。比如我上

她的吻让他 5293

cJson的使用,C语言解析Json字符串

/* Copyright (c) 2009-2017 Dave Gamble and cJSON contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restr.

m0_50075609的博客 2304
上一篇: c++创建多级目录
下一篇: VS开发ffmpeg环境搭建
RuningPigNO1
博客等级 码龄10年 22粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值