首页 > 其他分享 >c 使用cJSON生成及解析json类型数据

c 使用cJSON生成及解析json类型数据

时间:2024-07-23 15:58:03浏览次数:8  
标签:cout cJSON fmt AddNumberToObject json 解析 root

一、概述

  cJSON官网

  作用:可以在c程序中方便的进行json字符串的解析及生成

 

二、代码示例

//组装一个json串
void CJsonTest::valueToJsonObject() {
    cJSON* root, * fmt;
    char* out;
    root = cJSON_CreateObject();//创建一个obj(申请了堆内存记得释放)
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("luoluoyang"));
    cJSON_AddNumberToObject(root, "age", 6);
    cJSON_AddItemToObject(root, "address", fmt = cJSON_CreateObject());//创建一个新的Object放入到root中
    //给新的对象增加属性
    cJSON_AddStringToObject(fmt, "addr", "he nan");
    cJSON_AddNumberToObject(fmt, "width", 10);
    cJSON_AddNumberToObject(fmt, "height", 10);
    cJSON_AddFalseToObject(fmt, "interlace");
    cJSON_AddTrueToObject(fmt, "isOpen");
    cJSON_AddNumberToObject(fmt, "frame_rate", 24);
    //将cJSON转为json字符串输出
    out = cJSON_Print(root);
    cout << out << endl;
    //释放申请的内存空间
    cJSON_Delete(root);
    free(out);
}

//解析json串
void CJsonTest::parseJsonObject() {
    //组装json字符串(用于最后的测试)
    char* jsonStr;
    cJSON* root;
    root = cJSON_CreateObject();//初始化cJSON,这一步需要申请内存,记得清理
    cJSON_AddStringToObject(root, "name", "LOL");//添加一个name属性,value是LOL
    cJSON* heros, * countrys;
    heros = cJSON_AddArrayToObject(root, "heros");//向root中添加一个heros数组
    //向数组中添加元素
    cJSON_AddItemToArray(heros, cJSON_CreateString("Tom"));
    cJSON_AddItemToArray(heros, cJSON_CreateString("Jack"));
    countrys = cJSON_AddArrayToObject(root, "countrys");//再创一个数组
    cJSON* obj = cJSON_CreateObject();//创建一个object
    cJSON_AddStringToObject(obj, "name", "xiao ming");
    cJSON_AddNumberToObject(obj, "age", 10);
    cJSON_AddItemToArray(countrys, obj);//将obj添加进数组
    jsonStr = cJSON_Print(root);
    cout << jsonStr << endl;
    cJSON_Delete(root);

    //解析json字符串
    cJSON* parseObj = cJSON_Parse(jsonStr);
    char* rootName = cJSON_GetObjectItem(parseObj, "name")->valuestring;
    cout << "rootName:" << rootName << endl;
    //从根节点中拿到数组
    cJSON* arrStr = cJSON_GetObjectItem(parseObj, "heros");
    //拿到json数组的长度
    int arrLen = cJSON_GetArraySize(arrStr);
    //循环从数组中取出item
    for (int i = 0;i < arrLen;i++) {
        char* nameStr = cJSON_GetArrayItem(arrStr, i)->valuestring;
        cout << "nameStr:" << nameStr << endl;
    }
    //从object中取出对象数组
    cJSON* myCountrys = cJSON_GetObjectItem(parseObj, "countrys");
    cout << "myCountrys:" << cJSON_Print(myCountrys) << endl;
    cout << "------------解析jsonObject----------" << endl;
    //获取对象数组的长度
    int countryLen = cJSON_GetArraySize(myCountrys);
    //循环遍历对象数组,并解析里面对象的value值
    for (int i = 0;i < countryLen;i++) {
        cJSON* myObj = cJSON_GetArrayItem(myCountrys, i);
        char* itemName = cJSON_GetObjectItem(myObj, "name")->valuestring;
        cout << "itemName:" << itemName << endl;
        int myAge = cJSON_GetObjectItem(myObj, "age")->valueint;
        cout << "myAge:" << myAge << endl;
    }

    //释放开辟的内存
    if (parseObj) {
        cJSON_Delete(parseObj);
    }
    free(jsonStr);
}

 

标签:cout,cJSON,fmt,AddNumberToObject,json,解析,root
From: https://www.cnblogs.com/tony-yang-flutter/p/18318635

相关文章

  • CeiT(ICCV 2021, SenseTime)论文与代码解析
    paper:IncorporatingConvolutionDesignsintoVisualTransformersofficialimplementation:GitHub-coeusguo/ceit背景近年来,Transformer在自然语言处理(NLP)任务中取得了巨大的成功,并且开始有一些尝试将其应用于视觉领域。然而,纯Transformer架构在视觉任务中通常需要大量的......
  • Android开发 - onMeasure、onLayout和onDraw方法解析
    onLayout、onMeasure和onDraw方法介绍onMeasure(intwidthMeasureSpec,intheightMeasureSpec)onMeasure方法用于测量View的大小。在自定义View中,我们需要重写这个方法,根据自定义View.xml视图的宽高测量模式(MeasureSpec)来计算并设置自定义View的宽高MeasureSpec:测量规范,以......
  • Android开发 - ViewGroup解析与自定义
    ViewGroup解析ViewGroup是一个特殊的View,可以包含其他视图(称为子视图)。而ViewGroup是View的子类,所以ViewGroup可以当成普通的UI组件使用。ViewGroup是布局和视图容器的基类,该类还定义了ViewGroup.LayoutParams用作布局参数基类的类由于ViewGroup的直接子类和间接子类比较......
  • 深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
    深入理解SpringBoot:Bean管理、原理解析与Maven高级应用前言大家好,今天我们来聊聊SpringBoot的核心内容,包括Bean管理、SpringBoot的工作原理以及Maven的高级应用。这些内容不仅是SpringBoot的基础,也是我们在实际项目中经常会遇到的问题。希望通过这篇文章,能让大家对SpringBo......
  • 深入解析 Spring 配置文件:从基础到高级
    深入解析Spring配置文件:从基础到高级在Spring框架中,配置文件是一个至关重要的组成部分。它不仅仅是一个简单的XML文件或Java类,它是整个应用程序的心脏,决定了应用程序的行为和结构。今天,我们将深入探讨Spring配置文件,从基础概念到高级用法,带你全面了解它的强大功能。什......
  • 深入解析 @SpringBootApplication 注解及其源码
    深入解析@SpringBootApplication注解及其源码在SpringBoot开发中,@SpringBootApplication注解几乎是每个项目的起点。它不仅简化了配置,还集成了多个核心注解。今天,我们将深入探讨这个注解的内部机制,并通过代码示例来展示其强大功能。1.@SpringBootApplication是什么?简单......
  • 快手矩阵系统全解析:功能、优势与特点一网打尽
    在数字化时代,短视频已成为连接创作者与观众的重要媒介。快手矩阵系统以其独特的功能和优势,为短视频的创作、管理和发布提供了一站式解决方案,极大地提升了内容运营的效率和效果。功能概览智能创作:AI技术的应用使得快手矩阵系统能够自动生成与视频主题高度契合的文案,极大提升了......
  • 处理json格式的数据
    如何处理json格式的数据1.主要处理三类数据带有json格式的数据形式:[{key:value}]提取:文字、图片链接、文档链接[{"content":"点击“产品开发库”,右上角“展开筛选”,按条件筛选流程信息。","type":"text"},{"content":"\n","type":"text"},{"......
  • @RequestPart-Java接口,同时传参JSON对象数据和文件
    简单介绍前端传递文件参数的时候,通常会使用POST方式传参,将请求header的content-type设置为:multipart/form-data(因为GET请求只能传递文本类型的参数,而文件属于二进制数据,无法直接通过GET方式传递。)前端通过POST传参时,header的content-type设置为"application/json"......
  • Android开发 - LayoutParams解析
    LayoutParams翻译过来就是布局参数,子View通过LayoutParams告诉父容器(ViewGroup)应该如何放置自己。从这个定义中也可以看出来LayoutParams与ViewGroup是息息相关的,因此脱离ViewGroup谈LayoutParams是没有意义的。事实上,每个ViewGroup的子类都有自己对应的LayoutParams类,典型的如L......