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

如何通过网站标题找网站视频营销发布平台包括

如何通过网站标题找网站,视频营销发布平台包括,建立网站可以赚钱吗?,wordpress被设置不录入编写方向#xff1a;本人就不泛泛的编写一篇什么一文学会cJSON了#xff0c;没什么突出点#xff0c;也就我水水字数#xff0c;你们看来看去也不懂#xff0c;本人是从上阿里云传信息接触的cJSON的#xff0c;我就此写一篇针对性的文章#xff0c;希望对大家有用#…        编写方向本人就不泛泛的编写一篇什么一文学会cJSON了没什么突出点也就我水水字数你们看来看去也不懂本人是从上阿里云传信息接触的cJSON的我就此写一篇针对性的文章希望对大家有用后期我在其他方面用到还会继续更新。 一、简介 cJSON是一个用C语言编写的轻量级JSON解析器和生成器库。它由Derek M. Jones创建旨在为C程序员提供一种简单的方法来处理JSON数据。cJSON的主要特点包括 易用性cJSON设计得非常直观使得JSON对象的创建和处理变得简单直接。动态内存管理cJSON内部会自动管理内存分配与释放简化了用户代码。错误处理能够报告解析错误的位置和其他相关信息。支持完整的JSON数据类型包括数字、字符串、布尔值、数组、对象等。 使用cJSON你可以轻松地创建JSON对象添加键值对然后将其转换为字符串。相反你也可以解析JSON字符串提取其中的值并根据需要操作它们。 二、解决的问题 1、问题阐述 首先我先阐述一下我遇到的问题我在用以下这种格式图-1上传动态数据到阿里云端的时候发现—“字符串%s“—形式的数据上传的时候不被识别如图-2所示 图-1  图-2 sprintf基本用法及示例 是 C 语言中的一个标准库函数用于格式化输出到一个字符串中。它的工作方式类似于 printf 函数但是输出不是发送到标准输出设备通常是屏幕而是写入到一个字符数组中。 示例 #include stdio.h #include string.hint main() {int num 42;char str[20];sprintf(str, The answer is %d, num);printf(%s\n, str); // 输出: The answer is 42return 0; } 三、cJSON构建传输字符串  1、完整的构建代码希望大家阅读代码的时候可以把代码复制出去然后对照着我下面的讲解看 void set_temp_humid(void) {/*定义变量定义需要上传的各类信息我这里就先以固定数实现数据上传*/int humid 1;int temperature 1;char ID[10];IC_IDGet(ID);u1_printf (%s,ID);/*定义用来存放构建的JSON转化的字符串*/char *str NULL; // 指向JSON字符串的指针/*此处用cJSON结构体定义一个对象用来存放需要构建的信息*/cJSON *json cJSON_CreateObject(); // 创建一个空的JSON对象cJSON *params_cjson cJSON_CreateObject(); // 创建一个空的子JSON对象// 向子JSON对象添加数据cJSON_AddNumberToObject(params_cjson, humid, humid);cJSON_AddNumberToObject(params_cjson, temp, temperature);cJSON_AddStringToObject(params_cjson, ID, ID);// 向主JSON对象添加数据cJSON_AddItemToObject(json, method, cJSON_CreateString(thing.service.property.post));cJSON_AddItemToObject(json, id, cJSON_CreateString(99119635));cJSON_AddItemToObject(json, params, params_cjson);cJSON_AddItemToObject(json, version, cJSON_CreateString(1.0.0));// 将JSON对象转换为无格式的字符串str cJSON_PrintUnformatted(json);// 打印JSON格式的字符串u1_printf(json格式 %s\r\n, str);MQTT_PublishQs0(P_TOPIC_NAME,str,strlen(str)); //添加数据发布给服务器 // 清理JSON对象占用的内存cJSON_Delete(json);// 如果分配了额外的字符串空间释放它if(str ! NULL){free(str);str NULL;u1_printf(释放str空间成功\r\n);}Delay_ms(1000);} 2、详细讲解 第一步 先对需要上传的信息变量进行定义用来接收各个传感器模块收集到的动态数据  第二步 定义一个可以接收自己后面构建的JSON字符串转化成的无格式字符串 第三步 用cJSON结构体 定义空的主JSON对象和子JSON对象 第四步 分别向子JSON对象和主JSON对象添加要构建的数据         第五步 转换JSON对象为无格式的字符串并存入前面定义的str指针 第六步 一定要将“ JSON “对象和存储无格式字符串用的指针 str 清空要不然会造成占用内存导致卡机 四、相关函数详解  ①、cJSON_CreateObject() 是一个用于创建 JSON 对象的基础函数        具体用法如下 ②、向JSON对象中添加数据的几类函数 cJSON_AddNullToObject(object, name) 作用向 JSON 对象中添加一个 null 值。参数 object指向 cJSON 结构体的指针表示要添加 null 值的目标 JSON 对象。name键名字符串表示 null 值对应的键。 cJSON_AddTrueToObject(object, name) 作用向 JSON 对象中添加一个布尔值 true。参数 object指向 cJSON 结构体的指针表示要添加 true 值的目标 JSON 对象。name键名字符串表示 true 值对应的键。 cJSON_AddFalseToObject(object, name) 作用向 JSON 对象中添加一个布尔值 false。参数 object指向 cJSON 结构体的指针表示要添加 false 值的目标 JSON 对象。name键名字符串表示 false 值对应的键。 cJSON_AddBoolToObject(object, name, b) 作用向 JSON 对象中添加一个布尔值可以是 true 或 false。参数 object指向 cJSON 结构体的指针表示要添加布尔值的目标 JSON 对象。name键名字符串表示布尔值对应的键。b布尔值可以是 true 或 false通常为 1 或 0。 cJSON_AddNumberToObject(object, name, n) 作用向 JSON 对象中添加一个数值。参数 object指向 cJSON 结构体的指针表示要添加数值的目标 JSON 对象。name键名字符串表示数值对应的键。n数值通常是 double 类型表示要添加的数值。 cJSON_AddStringToObject(object, name, s) 作用向 JSON 对象中添加一个字符串值。参数 object指向 cJSON 结构体的指针表示要添加字符串值的目标 JSON 对象。name键名字符串表示字符串值对应的键。s字符串值通常是 char * 类型表示要添加的字符串。 具体应用 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Serial.h #include led.h #include cJSON.huint8_t RxData; //定义用于接收串口数据的变量int main(void) {/*串口初始化*/Serial_Init();while (1){cJSON *json cJSON_CreateObject();// 向 JSON 对象中添加不同类型的值cJSON_AddStringToObject(json, name, Alice);cJSON_AddNumberToObject(json, age, 25);cJSON_AddBoolToObject(json, is_student, 1);cJSON_AddNullToObject(json, job);cJSON_AddTrueToObject(json, is_active);cJSON_AddFalseToObject(json, is_admin);// 打印 JSON 对象Serial_Printf(%s\n, cJSON_Print(json));// 清理内存cJSON_Delete(json);Delay_ms(100);}} 结果显示  ③、cJSON_PrintUnformatted 是 cJSON 库中的一个函数用于将 cJSON 结构体转换为一个未格式化的 JSON 字符串。 具体用法 ④、free、cJSON_Delete free是 C 标准库中的一个函数用于释放之前通过 malloc、calloc 或 realloc 动态分配的内存块。 cJSON_Delete 是 cJSON 库提供的一个专用函数用于释放 cJSON 结构体及其关联的所有内存。当你使用 cJSON 库创建了 JSON 对象或数组时应该使用 cJSON_Delete 来释放这些对象占用的内存。 具体用法 五、以STM32C8T6为核心的构建过程可能会产生的问题  1、当你的项目代码很多时会出现的相关问题 因为代码过多单片机的内存资源有限如果之前没有做过改变空间资源等先关操作的人第一次可能会发现将代码移植到一个简单工程中的时候可以正常运行但是当自己移植到一个相对复杂的程序中时整个程序好像不动了串口打印也消失了这个时候就是内存分配的原因导致的。可以从以下这个地方改动来匹配自己的程序。 ①、找到后缀为 .s 的这个文件这是单片机的启动文件 ②、修改以下箭头指的地方正常来说这里应该是0x00000200,我这里是根据我的工作做了修改大家可以根据自己的工程需要分配大小 六、cJSON源码 cJSON.c /*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the Software), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. *//* cJSON */ /* JSON parser in C. */#include string.h #include stdio.h #include math.h #include stdlib.h #include float.h #include limits.h #include ctype.h #include cJSON.hstatic const char *ep;const char *cJSON_GetErrorPtr(void) {return ep;}static int cJSON_strcasecmp(const char *s1,const char *s2) {if (!s1) return (s1s2)?0:1;if (!s2) return 1;for(; tolower(*s1) tolower(*s2); s1, s2) if(*s1 0) return 0;return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); }static void *(*cJSON_malloc)(size_t sz) malloc; static void (*cJSON_free)(void *ptr) free;static char* cJSON_strdup(const char* str) {size_t len;char* copy;len strlen(str) 1;if (!(copy (char*)cJSON_malloc(len))) return 0;memcpy(copy,str,len);return copy; }void cJSON_InitHooks(cJSON_Hooks* hooks) {if (!hooks) { /* Reset hooks */cJSON_malloc malloc;cJSON_free free;return;}cJSON_malloc (hooks-malloc_fn)?hooks-malloc_fn:malloc;cJSON_free (hooks-free_fn)?hooks-free_fn:free; }/* Internal constructor. */ static cJSON *cJSON_New_Item(void) {cJSON* node (cJSON*)cJSON_malloc(sizeof(cJSON));if (node) memset(node,0,sizeof(cJSON));return node; }/* Delete a cJSON structure. */ void cJSON_Delete(cJSON *c) {cJSON *next;while (c){nextc-next;if (!(c-typecJSON_IsReference) c-child) cJSON_Delete(c-child);if (!(c-typecJSON_IsReference) c-valuestring) cJSON_free(c-valuestring);if (!(c-typecJSON_StringIsConst) c-string) cJSON_free(c-string);cJSON_free(c);cnext;} }/* Parse the input text to generate a number, and populate the result into item. */ static const char *parse_number(cJSON *item,const char *num) {double n0,sign1,scale0;int subscale0,signsubscale1;if (*num-) sign-1,num; /* Has sign? */if (*num0) num; /* is zero */if (*num1 *num9) do n(n*10.0)(*num -0); while (*num0 *num9); /* Number? */if (*num. num[1]0 num[1]9) {num; do n(n*10.0)(*num -0),scale--; while (*num0 *num9);} /* Fractional part? */if (*nume || *numE) /* Exponent? */{ num;if (*num) num; else if (*num-) signsubscale-1,num; /* With sign? */while (*num0 *num9) subscale(subscale*10)(*num - 0); /* Number? */}nsign*n*pow(10.0,(scalesubscale*signsubscale)); /* number /- number.fraction * 10^/- exponent */item-valuedoublen;item-valueint(int)n;item-typecJSON_Number;return num; }static int pow2gt (int x) { --x; x|x1; x|x2; x|x4; x|x8; x|x16; return x1; }typedef struct {char *buffer; int length; int offset; } printbuffer;static char* ensure(printbuffer *p,int needed) {char *newbuffer;int newsize;if (!p || !p-buffer) return 0;neededp-offset;if (neededp-length) return p-bufferp-offset;newsizepow2gt(needed);newbuffer(char*)cJSON_malloc(newsize);if (!newbuffer) {cJSON_free(p-buffer);p-length0,p-buffer0;return 0;}if (newbuffer) memcpy(newbuffer,p-buffer,p-length);cJSON_free(p-buffer);p-lengthnewsize;p-buffernewbuffer;return newbufferp-offset; }static int update(printbuffer *p) {char *str;if (!p || !p-buffer) return 0;strp-bufferp-offset;return p-offsetstrlen(str); }/* Render the number nicely from the given item into a string. */ static char *print_number(cJSON *item,printbuffer *p) {char *str0;double ditem-valuedouble;if (d0){if (p) strensure(p,2);else str(char*)cJSON_malloc(2); /* special case for 0. */if (str) strcpy(str,0);}else if (fabs(((double)item-valueint)-d)DBL_EPSILON dINT_MAX dINT_MIN){if (p) strensure(p,21);else str(char*)cJSON_malloc(21); /* 2^641 can be represented in 21 chars. */if (str) sprintf(str,%d,item-valueint);}else{if (p) strensure(p,64);else str(char*)cJSON_malloc(64); /* This is a nice tradeoff. */if (str){if (fabs(floor(d)-d)DBL_EPSILON fabs(d)1.0e60)sprintf(str,%.0f,d);else if (fabs(d)1.0e-6 || fabs(d)1.0e9) sprintf(str,%e,d);else sprintf(str,%f,d);}}return str; }static unsigned parse_hex4(const char *str) {unsigned h0;if (*str0 *str9) h(*str)-0; else if (*strA *strF) h10(*str)-A; else if (*stra *strf) h10(*str)-a; else return 0;hh4;str;if (*str0 *str9) h(*str)-0; else if (*strA *strF) h10(*str)-A; else if (*stra *strf) h10(*str)-a; else return 0;hh4;str;if (*str0 *str9) h(*str)-0; else if (*strA *strF) h10(*str)-A; else if (*stra *strf) h10(*str)-a; else return 0;hh4;str;if (*str0 *str9) h(*str)-0; else if (*strA *strF) h10(*str)-A; else if (*stra *strf) h10(*str)-a; else return 0;return h; }/* Parse the input text into an unescaped cstring, and populate item. */ static const unsigned char firstByteMark[7] { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; static const char *parse_string(cJSON *item,const char *str) {const char *ptrstr1;char *ptr2;char *out;int len0;unsigned uc,uc2;if (*str!\) {epstr;return 0;} /* not a string! */while (*ptr!\ *ptr len) if (*ptr \\) ptr; /* Skip escaped quotes. */out(char*)cJSON_malloc(len1); /* This is how long we need for the string, roughly. */if (!out) return 0;ptrstr1;ptr2out;while (*ptr!\ *ptr){if (*ptr!\\) *ptr2*ptr;else{ptr;switch (*ptr){case b: *ptr2\b; break;case f: *ptr2\f; break;case n: *ptr2\n; break;case r: *ptr2\r; break;case t: *ptr2\t; break;case u: /* transcode utf16 to utf8. */ucparse_hex4(ptr1);ptr4; /* get the unicode char. */if ((uc0xDC00 uc0xDFFF) || uc0) break; /* check for invalid. */if (uc0xD800 uc0xDBFF) /* UTF16 surrogate pairs. */{if (ptr[1]!\\ || ptr[2]!u) break; /* missing second-half of surrogate. */uc2parse_hex4(ptr3);ptr6;if (uc20xDC00 || uc20xDFFF) break; /* invalid second-half of surrogate. */uc0x10000 (((uc0x3FF)10) | (uc20x3FF));}len4;if (uc0x80) len1;else if (uc0x800) len2;else if (uc0x10000) len3; ptr2len;switch (len) {case 4: *--ptr2 ((uc | 0x80) 0xBF); uc 6;case 3: *--ptr2 ((uc | 0x80) 0xBF); uc 6;case 2: *--ptr2 ((uc | 0x80) 0xBF); uc 6;case 1: *--ptr2 (uc | firstByteMark[len]);}ptr2len;break;default: *ptr2*ptr; break;}ptr;}}*ptr20;if (*ptr\) ptr;item-valuestringout;item-typecJSON_String;return ptr; }/* Render the cstring provided to an escaped version that can be printed. */ static char *print_string_ptr(const char *str,printbuffer *p) {const char *ptr;char *ptr2,*out;int len0,flag0;unsigned char token;for (ptrstr;*ptr;ptr) flag|((*ptr0 *ptr32)||(*ptr\)||(*ptr\\))?1:0;if (!flag){lenptr-str;if (p) outensure(p,len3);else out(char*)cJSON_malloc(len3);if (!out) return 0;ptr2out;*ptr2\;strcpy(ptr2,str);ptr2[len]\;ptr2[len1]0;return out;}if (!str){if (p) outensure(p,3);else out(char*)cJSON_malloc(3);if (!out) return 0;strcpy(out,\\);return out;}ptrstr;while ((token*ptr) len) {if (strchr(\\\\b\f\n\r\t,token)) len; else if (token32) len5;ptr;}if (p) outensure(p,len3);else out(char*)cJSON_malloc(len3);if (!out) return 0;ptr2out;ptrstr;*ptr2\;while (*ptr){if ((unsigned char)*ptr31 *ptr!\ *ptr!\\) *ptr2*ptr;else{*ptr2\\;switch (token*ptr){case \\: *ptr2\\; break;case \: *ptr2\; break;case \b: *ptr2b; break;case \f: *ptr2f; break;case \n: *ptr2n; break;case \r: *ptr2r; break;case \t: *ptr2t; break;default: sprintf(ptr2,u%04x,token);ptr25; break; /* escape and print */}}}*ptr2\;*ptr20;return out; } /* Invote print_string_ptr (which is useful) on an item. */ static char *print_string(cJSON *item,printbuffer *p) {return print_string_ptr(item-valuestring,p);}/* Predeclare these prototypes. */ static const char *parse_value(cJSON *item,const char *value); static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p); static const char *parse_array(cJSON *item,const char *value); static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p); static const char *parse_object(cJSON *item,const char *value); static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p);/* Utility to jump whitespace and cr/lf */ static const char *skip(const char *in) {while (in *in (unsigned char)*in32) in; return in;}/* Parse an object - create a new root, and populate. */ cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated) {const char *end0;cJSON *ccJSON_New_Item();ep0;if (!c) return 0; /* memory fail */endparse_value(c,skip(value));if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. *//* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */if (require_null_terminated) {endskip(end);if (*end) {cJSON_Delete(c);epend;return 0;}}if (return_parse_end) *return_parse_endend;return c; } /* Default options for cJSON_Parse */ cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);}/* Render a cJSON item/entity/structure to text. */ char *cJSON_Print(cJSON *item) {return print_value(item,0,1,0);} char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0,0);}char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt) {printbuffer p;p.buffer(char*)cJSON_malloc(prebuffer);p.lengthprebuffer;p.offset0;return print_value(item,0,fmt,p);return p.buffer; }/* Parser core - when encountering text, process appropriately. */ static const char *parse_value(cJSON *item,const char *value) {if (!value) return 0; /* Fail on null. */if (!strncmp(value,null,4)) { item-typecJSON_NULL; return value4; }if (!strncmp(value,false,5)) { item-typecJSON_False; return value5; }if (!strncmp(value,true,4)) { item-typecJSON_True; item-valueint1; return value4; }if (*value\) { return parse_string(item,value); }if (*value- || (*value0 *value9)) { return parse_number(item,value); }if (*value[) { return parse_array(item,value); }if (*value{) { return parse_object(item,value); }epvalue;return 0; /* failure. */ }/* Render a value to text. */ static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p) {char *out0;if (!item) return 0;if (p){switch ((item-type)255){case cJSON_NULL: {outensure(p,5); if (out) strcpy(out,null); break;}case cJSON_False: {outensure(p,6); if (out) strcpy(out,false); break;}case cJSON_True: {outensure(p,5); if (out) strcpy(out,true); break;}case cJSON_Number: outprint_number(item,p);break;case cJSON_String: outprint_string(item,p);break;case cJSON_Array: outprint_array(item,depth,fmt,p);break;case cJSON_Object: outprint_object(item,depth,fmt,p);break;}}else{switch ((item-type)255){case cJSON_NULL: outcJSON_strdup(null); break;case cJSON_False: outcJSON_strdup(false);break;case cJSON_True: outcJSON_strdup(true); break;case cJSON_Number: outprint_number(item,0);break;case cJSON_String: outprint_string(item,0);break;case cJSON_Array: outprint_array(item,depth,fmt,0);break;case cJSON_Object: outprint_object(item,depth,fmt,0);break;}}return out; }/* Build an array from input text. */ static const char *parse_array(cJSON *item,const char *value) {cJSON *child;if (*value![) {epvalue;return 0;} /* not an array! */item-typecJSON_Array;valueskip(value1);if (*value]) return value1; /* empty array. */item-childchildcJSON_New_Item();if (!item-child) return 0; /* memory fail */valueskip(parse_value(child,skip(value))); /* skip any spacing, get the value. */if (!value) return 0;while (*value,){cJSON *new_item;if (!(new_itemcJSON_New_Item())) return 0; /* memory fail */child-nextnew_item;new_item-prevchild;childnew_item;valueskip(parse_value(child,skip(value1)));if (!value) return 0; /* memory fail */}if (*value]) return value1; /* end of array */epvalue;return 0; /* malformed. */ }/* Render an array to text */ static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p) {char **entries;char *out0,*ptr,*ret;int len5;cJSON *childitem-child;int numentries0,i0,fail0;size_t tmplen0;/* How many entries in the array? */while (child) numentries,childchild-next;/* Explicitly handle numentries0 */if (!numentries){if (p) outensure(p,3);else out(char*)cJSON_malloc(3);if (out) strcpy(out,[]);return out;}if (p){/* Compose the output array. */ip-offset;ptrensure(p,1);if (!ptr) return 0; *ptr[; p-offset;childitem-child;while (child !fail){print_value(child,depth1,fmt,p);p-offsetupdate(p);if (child-next) {lenfmt?2:1;ptrensure(p,len1);if (!ptr) return 0;*ptr,;if(fmt)*ptr ;*ptr0;p-offsetlen;}childchild-next;}ptrensure(p,2);if (!ptr) return 0; *ptr];*ptr0;out(p-buffer)i;}else{/* Allocate an array to hold the values for each */entries(char**)cJSON_malloc(numentries*sizeof(char*));if (!entries) return 0;memset(entries,0,numentries*sizeof(char*));/* Retrieve all the results: */childitem-child;while (child !fail){retprint_value(child,depth1,fmt,0);entries[i]ret;if (ret) lenstrlen(ret)2(fmt?1:0); else fail1;childchild-next;}/* If we didnt fail, try to malloc the output string */if (!fail) out(char*)cJSON_malloc(len);/* If that fails, we fail. */if (!out) fail1;/* Handle failure. */if (fail){for (i0;inumentries;i) if (entries[i]) cJSON_free(entries[i]);cJSON_free(entries);return 0;}/* Compose the output array. */*out[;ptrout1;*ptr0;for (i0;inumentries;i){tmplenstrlen(entries[i]);memcpy(ptr,entries[i],tmplen);ptrtmplen;if (i!numentries-1) {*ptr,;if(fmt)*ptr ;*ptr0;}cJSON_free(entries[i]);}cJSON_free(entries);*ptr];*ptr0;}return out; }/* Build an object from the text. */ static const char *parse_object(cJSON *item,const char *value) {cJSON *child;if (*value!{) {epvalue;return 0;} /* not an object! */item-typecJSON_Object;valueskip(value1);if (*value}) return value1; /* empty array. */item-childchildcJSON_New_Item();if (!item-child) return 0;valueskip(parse_string(child,skip(value)));if (!value) return 0;child-stringchild-valuestring;child-valuestring0;if (*value!:) {epvalue;return 0;} /* fail! */valueskip(parse_value(child,skip(value1))); /* skip any spacing, get the value. */if (!value) return 0;while (*value,){cJSON *new_item;if (!(new_itemcJSON_New_Item())) return 0; /* memory fail */child-nextnew_item;new_item-prevchild;childnew_item;valueskip(parse_string(child,skip(value1)));if (!value) return 0;child-stringchild-valuestring;child-valuestring0;if (*value!:) {epvalue;return 0;} /* fail! */valueskip(parse_value(child,skip(value1))); /* skip any spacing, get the value. */if (!value) return 0;}if (*value}) return value1; /* end of array */epvalue;return 0; /* malformed. */ }/* Render an object to text. */ static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p) {char **entries0,**names0;char *out0,*ptr,*ret,*str;int len7,i0,j;cJSON *childitem-child;int numentries0,fail0;size_t tmplen0;/* Count the number of entries. */while (child) numentries,childchild-next;/* Explicitly handle empty object case */if (!numentries){if (p) outensure(p,fmt?depth4:3);else out(char*)cJSON_malloc(fmt?depth4:3);if (!out) return 0;ptrout;*ptr{;if (fmt) {*ptr\n;for (i0;idepth-1;i) *ptr\t;}*ptr};*ptr0;return out;}if (p){/* Compose the output: */ip-offset;lenfmt?2:1; ptrensure(p,len1); if (!ptr) return 0;*ptr{; if (fmt) *ptr\n; *ptr0; p-offsetlen;childitem-child;depth;while (child){if (fmt){ptrensure(p,depth); if (!ptr) return 0;for (j0;jdepth;j) *ptr\t;p-offsetdepth;}print_string_ptr(child-string,p);p-offsetupdate(p);lenfmt?2:1;ptrensure(p,len); if (!ptr) return 0;*ptr:;if (fmt) *ptr\t;p-offsetlen;print_value(child,depth,fmt,p);p-offsetupdate(p);len(fmt?1:0)(child-next?1:0);ptrensure(p,len1); if (!ptr) return 0;if (child-next) *ptr,;if (fmt) *ptr\n;*ptr0;p-offsetlen;childchild-next;}ptrensure(p,fmt?(depth1):2); if (!ptr) return 0;if (fmt) for (i0;idepth-1;i) *ptr\t;*ptr};*ptr0;out(p-buffer)i;}else{/* Allocate space for the names and the objects */entries(char**)cJSON_malloc(numentries*sizeof(char*));if (!entries) return 0;names(char**)cJSON_malloc(numentries*sizeof(char*));if (!names) {cJSON_free(entries);return 0;}memset(entries,0,sizeof(char*)*numentries);memset(names,0,sizeof(char*)*numentries);/* Collect all the results into our arrays: */childitem-child;depth;if (fmt) lendepth;while (child){names[i]strprint_string_ptr(child-string,0);entries[i]retprint_value(child,depth,fmt,0);if (str ret) lenstrlen(ret)strlen(str)2(fmt?2depth:0); else fail1;childchild-next;}/* Try to allocate the output string */if (!fail) out(char*)cJSON_malloc(len);if (!out) fail1;/* Handle failure */if (fail){for (i0;inumentries;i) {if (names[i]) cJSON_free(names[i]);if (entries[i]) cJSON_free(entries[i]);}cJSON_free(names);cJSON_free(entries);return 0;}/* Compose the output: */*out{;ptrout1;if (fmt)*ptr\n;*ptr0;for (i0;inumentries;i){if (fmt) for (j0;jdepth;j) *ptr\t;tmplenstrlen(names[i]);memcpy(ptr,names[i],tmplen);ptrtmplen;*ptr:;if (fmt) *ptr\t;strcpy(ptr,entries[i]);ptrstrlen(entries[i]);if (i!numentries-1) *ptr,;if (fmt) *ptr\n;*ptr0;cJSON_free(names[i]);cJSON_free(entries[i]);}cJSON_free(names);cJSON_free(entries);if (fmt) for (i0;idepth-1;i) *ptr\t;*ptr};*ptr0;}return out; }/* Get Array size/item / object item. */ int cJSON_GetArraySize(cJSON *array) {cJSON *carray-child;int i0;while(c)i,cc-next;return i;} cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *carray-child; while (c item0) item--,cc-next; return c;} cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *cobject-child; while (c cJSON_strcasecmp(c-string,string)) cc-next; return c;}/* Utility for array list handling. */ static void suffix_object(cJSON *prev,cJSON *item) {prev-nextitem;item-prevprev;} /* Utility for handling references. */ static cJSON *create_reference(cJSON *item) {cJSON *refcJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref-string0;ref-type|cJSON_IsReference;ref-nextref-prev0;return ref;}/* Add item to array/object. */ void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *carray-child;if (!item) return; if (!c) {array-childitem;} else {while (c c-next) cc-next; suffix_object(c,item);}} void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item-string) cJSON_free(item-string);item-stringcJSON_strdup(string);cJSON_AddItemToArray(object,item);} void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (!(item-typecJSON_StringIsConst) item-string) cJSON_free(item-string);item-string(char*)string;item-type|cJSON_StringIsConst;cJSON_AddItemToArray(object,item);} void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));}cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {cJSON *carray-child;while (c which0) cc-next,which--;if (!c) return 0;if (c-prev) c-prev-nextc-next;if (c-next) c-next-prevc-prev;if (carray-child) array-childc-next;c-prevc-next0;return c;} void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i0;cJSON *cobject-child;while (c cJSON_strcasecmp(c-string,string)) i,cc-next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));}/* Replace array/object items with new ones. */ void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *carray-child;while (c which0) cc-next,which--;if (!c) {cJSON_AddItemToArray(array,newitem);return;}newitem-nextc;newitem-prevc-prev;c-prevnewitem;if (carray-child) array-childnewitem; else newitem-prev-nextnewitem;} void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *carray-child;while (c which0) cc-next,which--;if (!c) return;newitem-nextc-next;newitem-prevc-prev;if (newitem-next) newitem-next-prevnewitem;if (carray-child) array-childnewitem; else newitem-prev-nextnewitem;c-nextc-prev0;cJSON_Delete(c);} void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i0;cJSON *cobject-child;while(c cJSON_strcasecmp(c-string,string))i,cc-next;if(c){newitem-stringcJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}}/* Create basic types: */ cJSON *cJSON_CreateNull(void) {cJSON *itemcJSON_New_Item();if(item)item-typecJSON_NULL;return item;} cJSON *cJSON_CreateTrue(void) {cJSON *itemcJSON_New_Item();if(item)item-typecJSON_True;return item;} cJSON *cJSON_CreateFalse(void) {cJSON *itemcJSON_New_Item();if(item)item-typecJSON_False;return item;} cJSON *cJSON_CreateBool(int b) {cJSON *itemcJSON_New_Item();if(item)item-typeb?cJSON_True:cJSON_False;return item;} cJSON *cJSON_CreateNumber(double num) {cJSON *itemcJSON_New_Item();if(item){item-typecJSON_Number;item-valuedoublenum;item-valueint(int)num;}return item;} cJSON *cJSON_CreateString(const char *string) {cJSON *itemcJSON_New_Item();if(item){item-typecJSON_String;item-valuestringcJSON_strdup(string);}return item;} cJSON *cJSON_CreateArray(void) {cJSON *itemcJSON_New_Item();if(item)item-typecJSON_Array;return item;} cJSON *cJSON_CreateObject(void) {cJSON *itemcJSON_New_Item();if(item)item-typecJSON_Object;return item;}/* Create Arrays: */ cJSON *cJSON_CreateIntArray(const int *numbers,int count) {int i;cJSON *n0,*p0,*acJSON_CreateArray();for(i0;a icount;i){ncJSON_CreateNumber(numbers[i]);if(!i)a-childn;else suffix_object(p,n);pn;}return a;} cJSON *cJSON_CreateFloatArray(const float *numbers,int count) {int i;cJSON *n0,*p0,*acJSON_CreateArray();for(i0;a icount;i){ncJSON_CreateNumber(numbers[i]);if(!i)a-childn;else suffix_object(p,n);pn;}return a;} cJSON *cJSON_CreateDoubleArray(const double *numbers,int count) {int i;cJSON *n0,*p0,*acJSON_CreateArray();for(i0;a icount;i){ncJSON_CreateNumber(numbers[i]);if(!i)a-childn;else suffix_object(p,n);pn;}return a;} cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n0,*p0,*acJSON_CreateArray();for(i0;a icount;i){ncJSON_CreateString(strings[i]);if(!i)a-childn;else suffix_object(p,n);pn;}return a;}/* Duplication */ cJSON *cJSON_Duplicate(cJSON *item,int recurse) {cJSON *newitem,*cptr,*nptr0,*newchild;/* Bail on bad ptr */if (!item) return 0;/* Create new item */newitemcJSON_New_Item();if (!newitem) return 0;/* Copy over all vars */newitem-typeitem-type(~cJSON_IsReference),newitem-valueintitem-valueint,newitem-valuedoubleitem-valuedouble;if (item-valuestring) {newitem-valuestringcJSON_strdup(item-valuestring); if (!newitem-valuestring) {cJSON_Delete(newitem);return 0;}}if (item-string) {newitem-stringcJSON_strdup(item-string); if (!newitem-string) {cJSON_Delete(newitem);return 0;}}/* If non-recursive, then were done! */if (!recurse) return newitem;/* Walk the -next chain for the child. */cptritem-child;while (cptr){newchildcJSON_Duplicate(cptr,1); /* Duplicate (with recurse) each item in the -next chain */if (!newchild) {cJSON_Delete(newitem);return 0;}if (nptr) {nptr-nextnewchild,newchild-prevnptr;nptrnewchild;} /* If newitem-child already set, then crosswire -prev and -next and move on */else {newitem-childnewchild;nptrnewchild;} /* Set newitem-child and move to it */cptrcptr-next;}return newitem; }void cJSON_Minify(char *json) {char *intojson;while (*json){if (*json ) json;else if (*json\t) json; /* Whitespace characters. */else if (*json\r) json;else if (*json\n) json;else if (*json/ json[1]/) while (*json *json!\n) json; /* double-slash comments, to end of line. */else if (*json/ json[1]*) {while (*json !(*json* json[1]/)) json;json2;} /* multiline comments. */else if (*json\){*into*json;while (*json *json!\){if (*json\\) *into*json;*into*json;}*into*json;} /* string literals, which are \ sensitive. */else *into*json; /* All other characters. */}*into0; /* and null-terminate. */ }cJSON.h  /*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the Software), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. */#ifndef cJSON__h #define cJSON__h#ifdef __cplusplus extern C { #endif/* cJSON Types: */ #define cJSON_False 0 #define cJSON_True 1 #define cJSON_NULL 2 #define cJSON_Number 3 #define cJSON_String 4 #define cJSON_Array 5 #define cJSON_Object 6#define cJSON_IsReference 256 #define cJSON_StringIsConst 512/* The cJSON structure: */ typedef struct cJSON {struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */int type; /* The type of the item, as above. */char *valuestring; /* The items string, if typecJSON_String */int valueint; /* The items number, if typecJSON_Number */double valuedouble; /* The items number, if typecJSON_Number */char *string; /* The items name string, if this item is the child of, or is in the list of subitems of an object. */ } cJSON;typedef struct cJSON_Hooks {void *(*malloc_fn)(size_t sz);void (*free_fn)(void *ptr); } cJSON_Hooks;/* Supply malloc, realloc and free functions to cJSON */ extern void cJSON_InitHooks(cJSON_Hooks* hooks);/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ extern cJSON *cJSON_Parse(const char *value); /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ extern char *cJSON_Print(cJSON *item); /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ extern char *cJSON_PrintUnformatted(cJSON *item); /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt0 gives unformatted, 1 gives formatted */ extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt); /* Delete a cJSON entity and all subentities. */ extern void cJSON_Delete(cJSON *c);/* Returns the number of items in an array (or object). */ extern int cJSON_GetArraySize(cJSON *array); /* Retrieve item number item from array array. Returns NULL if unsuccessful. */ extern cJSON *cJSON_GetArrayItem(cJSON *array,int item); /* Get item string from object. Case insensitive. */ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);/* For analysing failed parses. This returns a pointer to the parse error. Youll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ extern const char *cJSON_GetErrorPtr(void);/* These calls create a cJSON item of the appropriate type. */ extern cJSON *cJSON_CreateNull(void); extern cJSON *cJSON_CreateTrue(void); extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); extern cJSON *cJSON_CreateArray(void); extern cJSON *cJSON_CreateObject(void);/* These utilities create an Array of count items. */ extern cJSON *cJSON_CreateIntArray(const int *numbers,int count); extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count); extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); extern cJSON *cJSON_CreateStringArray(const char **strings,int count);/* Append item to the specified array/object. */ extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item); /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object */ /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but dont want to corrupt your existing cJSON. */ extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);/* Remove/Detatch items from Arrays/Objects. */ extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); extern void cJSON_DeleteItemFromArray(cJSON *array,int which); extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);/* Update array items. */ extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem); /* Shifts pre-existing items to the right. */ extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);/* Duplicate a cJSON item */ extern cJSON *cJSON_Duplicate(cJSON *item,int recurse); /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will need to be released. With recurse!0, it will duplicate any children connected to the item. The item-next and -prev pointers are always zero on return from Duplicate. *//* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);extern void cJSON_Minify(char *json);/* Macros for creating things quickly. */ #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))/* When assigning an integer value, it needs to be propagated to valuedouble too. */ #define cJSON_SetIntValue(object,val) ((object)?(object)-valueint(object)-valuedouble(val):(val)) #define cJSON_SetNumberValue(object,val) ((object)?(object)-valueint(object)-valuedouble(val):(val))#ifdef __cplusplus } #endif#endif使用方法 就按照创建一个点亮LED灯工程那样新建源文件和头文件把这两段代码直接复制进去即可正常调用 七、工程源码 下面这篇文章中是一个未使用cJSON构建的大家下载下来后可以按照上述步骤操作一下毕竟实践才是检验真理的唯一标准需要构建完成的也可以后台私信我         STM32ESP8266MQTT协议连接阿里云实现温湿度上传https://mp.csdn.net/mp_blog/creation/editor/141951792
http://www.w-s-a.com/news/358649/

相关文章:

  • 地方门户类网站产品推广惠州市中国建设银行网站
  • 网站建设公司推荐5788移动版wordpress
  • 产品类型 速成网站淘宝怎么建立自己的网站
  • 南京优化网站建设公司的网站怎么建设
  • 做网站开发能挣钱月嫂云商城网站建设
  • 包装网站模板新手入门网站建设
  • 做网站的天津哪个公司做网站
  • 网站建设摊销时间是多久微信官网免费下载安装
  • 网站解析是做a记录吗群晖 wordpress 阿里云
  • 涉县移动网站建设公司常州做网站的公司有哪些
  • 网站批量创建程序中国十大人力资源公司
  • 菏泽网站建设 梧桐树二次开发创造作用
  • 维护网站费用长沙广告设计公司排名
  • 模仿别人网站侵权wordpress 修改链接失效
  • wordpress文章设置受密码保护南宁网站优化公司哪家好
  • 网站开发工程师介绍设计类的网站
  • 嘉兴seo网站推广中山建网站多少钱
  • 高端汽车网站建设帮别人做网站自己为什么会被抓
  • 网站开发实验室建设方案wordpress 主题丢失
  • 珠宝网站建设平台分析报告郑州最新发布
  • 世界杯最新排名泉州seo网站关键词优
  • 广州公司网站提供如何推广新品
  • 网站建设如何描述沈阳网站建设推广平台
  • 用dw制作个介绍家乡网站学生个人简历
  • 建设银行企业网站访问不了wordpress搬到谷歌服务器
  • 网站建设与网站优化销售别墅庭院园林景观设计公司
  • 沈阳红方城网站建设专业的微网站哪家好
  • 医院网站asp东营信息发布平台
  • 网站全站建设开题报告范文南京本地网站
  • 网站漏洞扫描工具wampserver集成环境搭建了一个织梦cms网站