需要用到的幾個函式:
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。上拉輸入 輸入高電平,然後接乙個 上拉電阻 保護作用 讀取此時的引腳電平為高電平 下拉輸入...