STM32學習筆記之Cjson的使用

2021-10-03 11:18:25 字數 3565 閱讀 6419

需要用到的幾個函式:

1、解析jsonj結構得到cjson物件:cjson * root=cjson_parse(char *buf);

2、獲取無格式的json物件:cjson_printunformatted(cjson *item)

3、根據鍵值獲取對應的值:cjson *cjson_getobjectitem(cjson *object,const char *string);

假設一串json字串如下:

}解析如下:

cjson_command com;

//此結構體為接收json各個鍵值的資料

cjson * root=

cjson_parse

(char

*buf)

;//buf指向cjson字串資料

c_add =

cjson_getobjectitem

(root,

"address");

strcpy

(com.address,c_add->valuestring)

;cjson * c_ctype =

null

; c_ctype =

cjson_getobjectitem

(root,

"commandtype");

strcpy

(com.commandtype,c_ctype->valuestring)

; cjson * c_epid =

null

; c_epid =

cjson_getobjectitem

(root,

"endpointid");

strcpy

(com.endpointid,c_epid->valuestring)

; cjson * c_com =

null

; c_com =

cjson_getobjectitem

(root,

"command");

if(c_com ==

null

)else

else

cjson_delete

(root)

;

注意:

我的例子裡 json字串的值全為char型別的,可根據實際情況設定變數,例如c_ctype->valuestring可以為valueint、valuedouble。

1、第一類:,],}

這類主要是有一項是陣列型別,裡面有多個陣列元素是json格式的字串,其他的和普通cjson解析一樣,到陣列那乙個物件的時候:

c_items =

cjson_getobjectitem

(values,

"stu");

if(c_items !=

null

)else

return0;

items_size =

cjson_getarraysize

(c_items);if

(items_size ==0)

cjson *arr_items = c_items->child;

for(n=0

; n)cjson_delete

(root)

;

2、第二類:乙個字串裡面有多個陣列物件,每個陣列裡面的值如下所示:

「sleepdata」: ,

「2020-04-21」:

}

items_size =

cjson_getarraysize

(c_lsleep)

;for

(icnt =

0; icnt < items_size; icnt++

)//strcpy();

}

其他跟之前的類似。

cjson *root,

*fmt;

root=

cjson_createobject()

;cjson_addstringtoobject

(root,

"address"

,sta.address)

;cjson_addstringtoobject

(root,

"endpointid"

,sta.endpointid)

;cjson_additemtoobject

(root,

"state"

, fmt=

cjson_createobject()

);cjson_addstringtoobject

(fmt,

"state"

, sta.state)

;cjson_addstringtoobject

(root,

"statetype"

,sta.statetype)

;cjson_addnumbertoobject

(root,

"devicetype"

,1101);

char

*out=

cjson_printunformatted

(root);if

(out)

合成結果如下:

,「statetype」: 「020d」,

「devicetype」: 1101

}注意:1、在合成的時候,發現不能列印出來的情況,無法合成cjson字串,程式出現跑飛的情況。原因是資料長度過大,堆大小不夠,導致溢位。辦法是startup_stm32f10x_md.s中調整堆大小即可。

2、出現記憶體錯誤,原因有可能你的記憶體申請和釋放函式不相容,在cjson.c檔案裡把你自己的替換掉,主要是這兩塊地方:

void*(

*cjson_malloc)

(size_t sz)

= myfwl_malloc;

void

(*cjson_free)

(void

*ptr)

= myfwl_free;

void

cjson_inithooks

(cjson_hooks* hooks)

//cjson_malloc = (hooks->malloc_fn)?hooks->malloc_fn: malloc;

//cjson_free = (hooks->free_fn)?hooks->free_fn: free;

//cjson_malloc = (hooks->malloc_fn)?hooks->malloc_fn:fwl_mallocandtrace;

//cjson_free = (hooks->free_fn)?hooks->free_fn:fwl_freeandtrace;

cjson_malloc = myfwl_malloc;

cjson_free = myfwl_free;

}

STM32學習筆記之 attribute

stm32也會遇到這樣的絕對定位的問題如下 uint8 t uart rx buf 1024 attribute at 0x20001000 就是將串列埠接收的資料定位到ram中起始位址為0x20001000 絕對定位要麼定位到flash 要麼定位到ram,這裡我們將定位在flash進行說明。mdk...

STM32學習筆記

剛到公司實習,要學習stm32開發,boss給了一塊戰艦開發板,讓我自己寫乙個功能要用在公司的產品上。難啊。以前根本沒接觸過stm32,只能一步一步慢慢來,利用晚上利用週末惡補一下。哎,算是為了大學前兩年還債吧。一 跑馬燈實驗 gpio輸出 實驗環境 keil4 實驗平台 戰艦stm32開發板 gp...

stm32學習筆記

開漏模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將埠 置於高阻狀態 p mos從 被啟用 推挽模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將啟用 p mos。上拉輸入 輸入高電平,然後接乙個 上拉電阻 保護作用 讀取此時的引腳電平為高電平 下拉輸入...