精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用cJSON庫來做數據組包及數據解析分享

Dp1040 ? 來源:嵌入式大雜燴 ? 2023-09-25 09:10 ? 次閱讀

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。JSON在互聯網相關開發中用得很多,在我們嵌入式中用得也不少。最近小編在項目中也有用到,分享分享。

簡單的JSON格式數據如:

{
"name":"xxx",
"num":xxx,
"c_score":xxx
}

這里我們需要知道一個概念:鍵值對。比如:

"name":"xxx"

像這樣子的就是一對鍵值對。

當我們作為發送方時,我們要把xxx這些有用的數據組合成JSON格式的數據發送給接收方;當我們作為接收方時,我們需要從這一堆JSON數據中解析出xxx這些有用的數據拿來使用。

簡單的JSON數據,我們使用C語言的一些字符串操作相關的庫函數也是可以做到組包和解析的,但是一些稍微復雜一點的JSON,可能就沒那么好操作了。

這時候我們可以借助一個第三方庫——cJSON庫,可以很方便來做數據組包及解析。

下面,我們通過實例來分享使用cJSON庫來做數據組包及數據解析。

一、組包與解析示例

1、確定協議數據

在實際開發中,要把JSON數據作為通信的數據,自然要先確定通信雙方要交互的數據有哪些,如有需要還需編寫形成協議文檔。協議文檔包含要傳輸的數據,數據類型等信息。

比如:

bc2e7e74-5b3b-11ee-939d-92fbcf53809c.png

2、組JSON數據包示例

從控制臺輸入一些學生信息,組合成字符串格式的JSON數據包,然后再輸出至控制臺。

操作示例:

bc539ff6-5b3b-11ee-939d-92fbcf53809c.png

首先,我們先從倉庫下載cJSON源碼,文件夾內容如:

bc696296-5b3b-11ee-939d-92fbcf53809c.png

我們只需要把cJSON.c、cJSON.h兩個文件復制到我們工程的根目錄下就可以使用,如:

bc82b0c0-5b3b-11ee-939d-92fbcf53809c.png

從cJSON.h可以看到其給我們提供了很多接口:

bc91fff8-5b3b-11ee-939d-92fbcf53809c.png

本例中我們重點關注如下幾個接口即可:

cJSON_CreateObject:創建JSON對象,{}擴起來的
cJSON_CreateString:創建字符串
cJSON_CreateNumber:創建int類型數據
cJSON_AddItemToObject:添加到JSON對象中
cJSON_Print:呈現為標準的JSON格式
cJSON_PrintUnformatted:呈現為去掉空格的JSON格式
cJSON_Delete:JSON對象刪除,做一些釋放內存的工作

我們創建的的組包函數如下:

staticchar*StudentsData_Packet(pStudentDef _Stu)
{
char*res_string=NULL;//返回值
cJSON*name=NULL;//名字
cJSON*num=NULL;//學號
cJSON*c_score=NULL;//C語言分數

/*創建一個JSON對象,{}擴起來*/
cJSON*obj=cJSON_CreateObject();
if(obj==NULL)
{
gotoend;
}

/*創建"name":"xxx"鍵值對*/
name=cJSON_CreateString(_Stu->name);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"name",name);

/*創建"num":207鍵值對*/
num=cJSON_CreateNumber(_Stu->num);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"num",num);

/*創建"c_score":95鍵值對*/
c_score=cJSON_CreateNumber(_Stu->c_score);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"c_score",c_score);

res_string=cJSON_Print(obj);//呈現為JSON格式
//res_string=cJSON_PrintUnformatted(obj);//呈現為無格式

if(res_string==NULL)
{
fprintf(stderr,"Failed to print monitor.
");
}

/*異常情況統一Delete(free)*/
end:
cJSON_Delete(obj);
returnres_string;
}

詳細解釋見注釋。我們重點看一下cJSON_Print與cJSON_PrintUnformatted這兩個接口。

這兩個接口的差別就是組合成的JSON數據是否有空格。

有空格的JSON數據,即用cJSON_Print時的效果為:

bca850be-5b3b-11ee-939d-92fbcf53809c.png

無空格的JSON數據,即用cJSON_PrintUnformatted時的效果為:

bcb8c1a6-5b3b-11ee-939d-92fbcf53809c.png

如果想要輸出查看時,當然是用cJSON_Print比較方便查看;如果是實際通信時,當然是用cJSON_PrintUnformatted會比較好,畢竟去掉空格就可以減小一定程度的通信負擔。

完整代碼:

/*
作者:ZhengN
公眾號:嵌入式大雜燴
*/

#include
#include
#include
#include"cJSON.h"

#defineSTU_NAME_LEN32

/*學生結構體*/
typedefstruct_Student
{
charname[STU_NAME_LEN];//名字
intnum;//學號
intc_score;//C語言分數
}StudentDef,*pStudentDef;

/*內部函數聲明*/
staticchar*StudentsData_Packet(pStudentDef _Stu);

/********************************************************************************************************
**函數:main
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
intmain(void)
{
charname[STU_NAME_LEN]={0};
intnum=0;
intc_score=0;
StudentDef stu;
intstu_count=0;
inti=0;

/*學生總人數*/
printf("Please input number of student:");
scanf("%d",&stu_count);

while(i++name);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"name",name);

/*創建"num":207鍵值對*/
num=cJSON_CreateNumber(_Stu->num);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"num",num);

/*創建"c_score":95鍵值對*/
c_score=cJSON_CreateNumber(_Stu->c_score);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"c_score",c_score);

res_string=cJSON_Print(obj);//呈現為JSON格式
//res_string=cJSON_PrintUnformatted(obj);//呈現為無格式

if(res_string==NULL)
{
fprintf(stderr,"Failed to print monitor.
");
}

/*異常情況統一Delete(free)*/
end:
cJSON_Delete(obj);
returnres_string;
}

3、解析JSON數據包示例

我們把我們想要解析的數據放到一個student_data.txt文件中,然后讀取其內容拿來解析,最后輸出解析結果。

student_data.txt的內容如:

bcc62526-5b3b-11ee-939d-92fbcf53809c.png

解析結果:

bcccb490-5b3b-11ee-939d-92fbcf53809c.png

關于這個示例我們需要關注的接口有:

cJSON_Parse:JSON解析函數,解析{}得到里面的內容
cJSON_GetObjectItemCaseSensitive:從對象中獲取鍵“字符串”。不分大小寫
cJSON_IsString:判斷是否是字符串
cJSON_IsNumber:判斷是否是整形數
cJSON_Delete:JSON對象刪除,做一些釋放內存的工作

我們創建的解析函數如下:

staticvoidStudentsData_Parse(pStudentDef _Stu,constchar*_JsonStudnetData)
{
cJSON*student_json=NULL;//student_json操作對象,可代表{}擴起來的內容
cJSON*name=NULL;
cJSON*num=NULL;
cJSON*c_score=NULL;

/*開始解析*/
student_json=cJSON_Parse(_JsonStudnetData);
if(NULL==student_json)
{
constchar*error_ptr=cJSON_GetErrorPtr();
if(error_ptr!=NULL)
{
fprintf(stderr,"Error before:%s
",error_ptr);
}
gotoend;
}

/*解析獲取name得值*/
name=cJSON_GetObjectItemCaseSensitive(student_json,"name");
if(cJSON_IsString(name)&&(name->valuestring!=NULL))
{
memcpy(&_Stu->name,name->valuestring,strlen(name->valuestring));
}

/*解析獲取num的值*/
num=cJSON_GetObjectItemCaseSensitive(student_json,"num");
if(cJSON_IsNumber(num))
{
_Stu->num=num->valueint;
}

/*解析獲取c_score的值*/
c_score=cJSON_GetObjectItemCaseSensitive(student_json,"c_score");
if(cJSON_IsNumber(c_score))
{
_Stu->c_score=c_score->valueint;
}

end:
cJSON_Delete(student_json);
}

解釋見注釋。

完整代碼:

/*
作者:ZhengN
公眾號:嵌入式大雜燴
*/
#include
#include
#include
#include"cJSON.h"

#defineSTU_NAME_LEN32

/*學生結構體*/
typedefstruct_Student
{
charname[STU_NAME_LEN];//名字
intnum;//學號
intc_score;//C語言分數
}StudentDef,*pStudentDef;

/*內部函數聲明*/
staticvoidStudentsData_Parse(pStudentDef _Stu,constchar*_JsonStudnetData);
staticvoidPrintParseResult(constpStudentDef _Stu);

/********************************************************************************************************
**函數:main
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
intmain(void)
{
StudentDef stu={0};//保存解析后的數據
intfile_len=0;//文件長度
FILE*fp=NULL;//文件句柄
char*data=NULL;//用于保存從文件讀出的數據

/*文件操作*/
if((fp=fopen("student_data.txt","r"))==NULL)
{
printf("Open file error!
");
exit(EXIT_FAILURE);
}
fseek(fp,0,SEEK_END);//文件位置指針指向文件末尾
file_len=ftell(fp);//獲取文末相對于文首的偏移值
fseek(fp,0,SEEK_SET);//文件位置指針指向文首
data=(char*)malloc(file_len+1);//為data申請堆內存
fread(data,file_len,1,fp);//讀取文件數據保存至data
fclose(fp);//關閉文件

/*解析*/
StudentsData_Parse(&stu,(constchar*)data);

/*打印輸出解析結果*/
PrintParseResult(&stu);

/*釋放內存*/
free(data);//防止內存泄漏
data=NULL;//防止出現野指針

return0;
}

/********************************************************************************************************
**函數:StudentsData_Parse,JOSN格式學生期末數據解析
**------------------------------------------------------------------------------------------------------
**參數:_JsonStudnetData:JSON數據_Stu:保存解析出的有用數據
**說明:
**返回:
********************************************************************************************************/
staticvoidStudentsData_Parse(pStudentDef _Stu,constchar*_JsonStudnetData)
{
cJSON*student_json=NULL;//student_json操作對象,可代表{}擴起來的內容
cJSON*name=NULL;
cJSON*num=NULL;
cJSON*c_score=NULL;

/*開始解析*/
student_json=cJSON_Parse(_JsonStudnetData);
if(NULL==student_json)
{
constchar*error_ptr=cJSON_GetErrorPtr();
if(error_ptr!=NULL)
{
fprintf(stderr,"Error before:%s
",error_ptr);
}
gotoend;
}

/*解析獲取name得值*/
name=cJSON_GetObjectItemCaseSensitive(student_json,"name");
if(cJSON_IsString(name)&&(name->valuestring!=NULL))
{
memcpy(&_Stu->name,name->valuestring,strlen(name->valuestring));
}

/*解析獲取num的值*/
num=cJSON_GetObjectItemCaseSensitive(student_json,"num");
if(cJSON_IsNumber(num))
{
_Stu->num=num->valueint;
}

/*解析獲取c_score的值*/
c_score=cJSON_GetObjectItemCaseSensitive(student_json,"c_score");
if(cJSON_IsNumber(c_score))
{
_Stu->c_score=c_score->valueint;
}

end:
cJSON_Delete(student_json);
}

/********************************************************************************************************
**函數:PrintParseResult,打印輸出解析結果
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
staticvoidPrintParseResult(constpStudentDef _Stu)
{
printf("name:%s,num:%d,c_score:%d
",_Stu->name,_Stu->num,_Stu->c_score);
}

二、綜合示例

上一節中我們的組包、解析demo都是分開測試的,這一節再分享一個兩個demo綜合起來的demo:

bcd6c980-5b3b-11ee-939d-92fbcf53809c.png

運行演示:

bcdd8b26-5b3b-11ee-939d-92fbcf53809c.gif

bcf48f60-5b3b-11ee-939d-92fbcf53809c.png

bd139810-5b3b-11ee-939d-92fbcf53809c.png

json_print.c完整代碼:

/*
作者:ZhengN
公眾號:嵌入式大雜燴
*/
#include
#include
#include
#include
#include"cJSON.h"

#defineSTU_NAME_LEN32

/*學生結構體*/
typedefstruct_Student
{
charname[STU_NAME_LEN];//名字
intnum;//學號
intc_score;//C語言分數
}StudentDef,*pStudentDef;

/*內部函數聲明*/
staticStudentDefStudentData_Prepare(void);
staticchar*StudentsData_Packet(pStudentDef _Stu);
staticvoidStudentData_Send(constchar*_data);

/********************************************************************************************************
**函數:main
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
intmain(void)
{
StudentDef stu={0};
char*stu_data=NULL;
intstu_count=0;
inti=0;

/*需要登記的學生總人數*/
printf("Please input number of student:");
scanf("%d",&stu_count);

while(i++name);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"name",name);

/*創建"num":207鍵值對*/
num=cJSON_CreateNumber(_Stu->num);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"num",num);

/*創建"c_score":95鍵值對*/
c_score=cJSON_CreateNumber(_Stu->c_score);
if(name==NULL)
{
gotoend;
}
cJSON_AddItemToObject(obj,"c_score",c_score);

res_string=cJSON_Print(obj);//呈現為JSON格式
//res_string=cJSON_PrintUnformatted(obj);//呈現為無格式

if(res_string==NULL)
{
fprintf(stderr,"Failed to print monitor.
");
}

/*異常情況統一Delete(free)*/
end:
cJSON_Delete(obj);
returnres_string;
}

/********************************************************************************************************
**函數:StudentData_Send,JSON格式字符串數據組包發送
**------------------------------------------------------------------------------------------------------
**參數:_data:要發送的數據
**說明:
**返回:
********************************************************************************************************/
staticvoidStudentData_Send(constchar*_data)
{
WSADATA wd;
  SOCKET ClientSock;
  SOCKADDR_INServerSockAddr;

printf("%s

",_data);

  /*初始化操作sock需要的DLL*/
  WSAStartup(MAKEWORD(2,2),&wd);

  /*向服務端發起請求*/
memset(&ServerSockAddr,0,sizeof(ServerSockAddr));
ServerSockAddr.sin_family=AF_INET;
ServerSockAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ServerSockAddr.sin_port=htons(1314);

/*創建客戶端socket*/
if(-1==(ClientSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
{
printf("socket error!
");
exit(EXIT_FAILURE);
}
if(-1==connect(ClientSock,(SOCKADDR*)&ServerSockAddr,sizeof(SOCKADDR)))
{
printf("connect error!
");
exit(EXIT_FAILURE);
}

/*發送數據到服務端*/
send(ClientSock,_data,strlen(_data),0);

/*關閉套接字*/
closesocket(ClientSock);
}

json_parse.c完整代碼:

左右滑動查看全部代碼>>>

/*
作者:ZhengN
公眾號:嵌入式大雜燴
*/
#include
#include
#include
#include
#include"cJSON.h"

#defineSTU_NAME_LEN32

/*學生結構體*/
typedefstruct_Student
{
charname[STU_NAME_LEN];//名字
intnum;//學號
intc_score;//C語言分數
}StudentDef,*pStudentDef;

/*內部函數聲明*/
staticchar*StudentsData_Recv(void);
staticvoidStudentsData_Parse(pStudentDef _Stu,constchar*_JsonStudnetData);
staticvoidPrintParseResult(constpStudentDef _Stu);
staticvoidSaveParseResult(constpStudentDef _Stu);

/*內部全局變量*/
staticFILE*stu_fp=NULL;

/********************************************************************************************************
**函數:main
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
intmain(void)
{
StudentDef stu={0};
char*recv_data;

while(1)
{
/*接收數據*/
recv_data=StudentsData_Recv();

/*解析*/
StudentsData_Parse(&stu,(constchar*)recv_data);

/*打印輸出解析結果*/
PrintParseResult(&stu);

/*保存數據到文件*/
SaveParseResult(&stu);

/*釋放內存*/
free(recv_data);//防止內存泄漏
recv_data=NULL;//防止出現野指針
}

return0;
}

/********************************************************************************************************
**函數:StudentsData_Recv,接收數據
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
staticchar*StudentsData_Recv(void)
{
WSADATA wd;
  SOCKADDR_IN ServerSockAddr;
intrecv_len=0;
char*recv_buf=(char*)malloc(512);
staticSOCKET ServerSock,ClientSock;
staticSOCKADDR ClientAddr;
staticintaddr_size=0;
staticintrun_count=0;

/*以下操作執行只一次就可以*/
if(0==run_count)
{
/*初始化操作sock需要的DLL*/
WSAStartup(MAKEWORD(2,2),&wd);

/*創建服務端socket*/
if(-1==(ServerSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
{
printf("server socket error!
");
exit(EXIT_FAILURE);
}

/*設置服務端信息*/
memset(&ServerSockAddr,0,sizeof(ServerSockAddr));//給結構體ServerSockAddr清零
ServerSockAddr.sin_family=AF_INET;//使用IPv4地址
ServerSockAddr.sin_addr.s_addr=inet_addr("127.0.0.1");//本機IP地址
ServerSockAddr.sin_port=htons(1314);//端口

/*綁定套接字*/
if(-1==bind(ServerSock,(SOCKADDR*)&ServerSockAddr,sizeof(SOCKADDR)))
{
printf("bind error!
");
exit(EXIT_FAILURE);
}

printf("bind ok!
");
/*進入監聽狀態*/
if(-1==listen(ServerSock,10))
{
printf("listen error!
");
exit(EXIT_FAILURE);
}
printf("listen ok!
");

addr_size=sizeof(SOCKADDR);
}

run_count++;

/*監聽客戶端請求,accept函數返回一個新的套接字,發送和接收都是用這個套接字*/
if(-1==(ClientSock=accept(ServerSock,(SOCKADDR*)&ClientAddr,&addr_size)))
{
printf("client socket error!
");
exit(EXIT_FAILURE);
}

/*接受客戶端的返回數據*/
memset(recv_buf,0,512);
recv_len=recv(ClientSock,recv_buf,512,0);
printf("%s
",recv_buf);

/*關閉客戶端套接字*/
closesocket(ClientSock);

/*返回獲取得到JSON數據*/
return(char*)recv_buf;
}

/********************************************************************************************************
**函數:StudentsData_Parse,JOSN格式學生期末數據解析
**------------------------------------------------------------------------------------------------------
**參數:_JsonStudnetData:JSON數據_Stu:保存解析出的有用數據
**說明:
**返回:
********************************************************************************************************/
staticvoidStudentsData_Parse(pStudentDef _Stu,constchar*_JsonStudnetData)
{
cJSON*student_json=NULL;//student_json操作對象,可代表{}擴起來的內容
cJSON*name=NULL;
cJSON*num=NULL;
cJSON*c_score=NULL;

/*開始解析*/
student_json=cJSON_Parse(_JsonStudnetData);
if(NULL==student_json)
{
constchar*error_ptr=cJSON_GetErrorPtr();
if(error_ptr!=NULL)
{
fprintf(stderr,"Error before:%s
",error_ptr);
}
gotoend;
}

/*解析獲取name得值*/
name=cJSON_GetObjectItemCaseSensitive(student_json,"name");
if(cJSON_IsString(name)&&(name->valuestring!=NULL))
{
memset(&_Stu->name,0,STU_NAME_LEN*sizeof(char));
memcpy(&_Stu->name,name->valuestring,strlen(name->valuestring));
}

/*解析獲取num的值*/
num=cJSON_GetObjectItemCaseSensitive(student_json,"num");
if(cJSON_IsNumber(num))
{
_Stu->num=num->valueint;
}

/*解析獲取c_score的值*/
c_score=cJSON_GetObjectItemCaseSensitive(student_json,"c_score");
if(cJSON_IsNumber(c_score))
{
_Stu->c_score=c_score->valueint;
}

end:
cJSON_Delete(student_json);
}

/********************************************************************************************************
**函數:PrintParseResult,打印輸出解析結果
**------------------------------------------------------------------------------------------------------
**參數:
**說明:
**返回:
********************************************************************************************************/
staticvoidPrintParseResult(constpStudentDef _Stu)
{
printf("name:%s,num:%d,c_score:%d

",_Stu->name,_Stu->num,_Stu->c_score);
}

/********************************************************************************************************
**函數:SaveParseResult,保存解析結果
**------------------------------------------------------------------------------------------------------
**參數:_Stu:需要保存的數據
**說明:
**返回:
********************************************************************************************************/
staticvoidSaveParseResult(constpStudentDef _Stu)
{
charwrite_buf[512]={0};
staticintstu_count=0;

/*以可在文件末尾追加內容的方式打開文件*/
  if((stu_fp=fopen("ParseResult.txt","a+"))==NULL)
  {
   printf("Open file error!
");
   returnexit(EXIT_FAILURE);
  }

/*按指定格式寫入文件*/
snprintf(write_buf,512,"name:%s,num:%d,c_score:%d
",_Stu->name,_Stu->num,_Stu->c_score);
size_tlen=fwrite((char*)write_buf,1,strlen(write_buf),stu_fp);

/*文件位置指針偏移*/
fseek(stu_fp,len*stu_count,SEEK_SET);
stu_count++;

/*關閉文件*/
fclose(stu_fp);
}

編譯命令:

左右滑動查看全部代碼>>>

gcc json_print.c cJSON.c-o json_print.exe-lwsocket32
gcc json_parse.c cJSON.c-o json_parse.exe-lwsocket32

綜合demo加了socket相關代碼,本篇筆記主要介紹JSON數據的組包及解析。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16203

    瀏覽量

    177413
  • 嵌入式
    +關注

    關注

    5068

    文章

    19019

    瀏覽量

    303292
  • 數據通信
    +關注

    關注

    2

    文章

    429

    瀏覽量

    33737
  • Stu
    Stu
    +關注

    關注

    0

    文章

    2

    瀏覽量

    7299
  • JSON
    +關注

    關注

    0

    文章

    117

    瀏覽量

    6940

原文標題:嵌入式實用知識之JSON數據

文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于stm32單片機的cjsonc語言例程

    大家好,現在給大家提供一個基于stm32f030單片機的cjsonc語言例程。json是在互聯網領域數據傳輸中較常用的協議,該協議比較輕量級也通俗易懂,在物聯網快速發展的時代,物物與平臺
    發表于 12-02 22:14

    LiteOS云端對接教程01-cJSON組件使用教程

    Notation,即 JS對象簡譜,是一種輕量級的數據格式。它采用完全獨立于編程語言的文本格式存儲和表示數據,語法簡潔、層次結構清晰,易于人閱讀和編寫,同時也易于機器解析和生成,有
    發表于 02-26 09:53

    cjson解析數據

    最近項目用到cjson解析數據,當解析的的數據比較長時,會
    發表于 01-12 06:14

    單片機如果不用cJSON會怎樣呢

    /*處理網絡數據的時候往往需要用到JSON數據格式,單片機如果不用cJSON,處理起來會非常吃力以下程序與注釋講解了cJSON在STM32
    發表于 02-21 07:31

    一文解讀基于RTThread使用libcs??v進行數據解析

    1、rtthread運行libcs??v 的使用最近做一個,需要做數據存儲化的。一開始是,使用數據生成的目標文件格式為項目名稱,保存數據文件
    發表于 08-25 15:40

    如何避免在解析cJSON時一個函數內出現過多的if語句呢?

    ,說明我們的cJSON格式的報文有很多的同級對象,不同的對象對應不同的業務,所以我們應該以業務進行劃分,盡量將不同的數據解析劃分到對應的業務代碼模塊中去。而不是全部都放在一塊,那樣自
    發表于 11-10 16:55

    在MQTT中的TCP樣例中,需要添加cjson解析代碼并將獲取到的數據輸出出去,應該如何修改代碼?

    NULL! ");}// 解析數據// char bssid[23] = {0};pJsonRoot = cJSON_GetObjectItem(pJsonRoot, "
    發表于 02-10 08:38

    在MQTT中的TCP樣例中,如何添加cjson解析代碼并將獲取到的數據輸出出去?

    NULL! ");}// 解析數據// char bssid[23] = {0};pJsonRoot = cJSON_GetObjectItem(pJsonRoot, "
    發表于 03-03 06:24

    在MQTT中的TCP樣例中,如何添加cjson解析代碼并將獲取到的數據輸出出去?

    ;, event->data_len, event->data);// 創建json數據解析對象pJsonRoot = cJSON_Parse(event->
    發表于 03-08 06:28

    RT-Thread使用cjson軟件發送64位長整型數據

      開發環境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,rt-thread版本為4.1.1,cjson軟件使用的版本
    發表于 03-13 15:54

    用Delphi數據庫開發

    用Delphi數據庫開發:實驗三 用Delphi數據庫開發一、實驗目的通過使用Delphi中BDE連接SQL數據庫,掌握Delphi環境
    發表于 05-10 11:05 ?44次下載

    STM32F103C8T6移植cJSON解析JSON數據包

    /*處理網絡數據的時候往往需要用到JSON數據格式,單片機如果不用cJSON,處理起來會非常吃力以下程序與注釋講解了cJSON在STM32
    發表于 12-27 18:29 ?27次下載
    STM32F103C8T6移植<b class='flag-5'>cJSON</b><b class='flag-5'>解析</b>JSON<b class='flag-5'>數據包</b>

    ZigBee3.0數據包解析

    ZigBee3.0是ZigBee聯盟推出的可以互聯互通的標準協議,用之前的Packet Sniffer抓包工具是無法解析ZigBee3.0的數據包,因ZigBee3.0的安全機制所有的數據包都是加密
    發表于 02-28 11:48 ?2646次閱讀
    ZigBee3.0<b class='flag-5'>數據包</b><b class='flag-5'>解析</b>

    Oracle數據庫ASM磁盤掉線的數據恢復案例

    數據庫故障: Oracle數據庫的ASM磁盤掉線,ASM實例不能掛載。管理員嘗試修復數據庫但是沒有成功。 數據庫
    的頭像 發表于 03-03 13:42 ?922次閱讀
    Oracle<b class='flag-5'>數據庫</b>ASM磁盤<b class='flag-5'>組</b>掉線的<b class='flag-5'>數據</b>恢復案例

    RT-Thread使用cjson軟件發送64位長整型數據

    開發環境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,rt-thread版本為4.1.1,cjson軟件使用的版本是latest。
    的頭像 發表于 10-11 15:09 ?873次閱讀
    RT-Thread使用<b class='flag-5'>cjson</b>軟件<b class='flag-5'>包</b>發送64位長整型<b class='flag-5'>數據</b>