json-c库使用总结
1. json_object_get與json_object_put函數?
struct json_object* json_object_get(struct json_object *jso); // 將json對象的引用計數加1,返回jso自身
void json_object_put(struct json_object *jso); // 將jso對象的引用計數減1。此時如果json的引用計數大于0,直接返回; 如果json的引用計數為0,則遞歸的對每個子對象的引用計數減1,子對象引用計數為0時釋放所占用內存。
注:如果對json對象顯式調用了json_object_get,之后必須成對調用json_object_put,否則將導致該json對象所占用內存泄漏。
2. json_object_new_XXX系列函數 struct json_object* json_object_new_object(void);
struct json_object* json_object_new_int(int i);
struct json_object* json_object_new_double(double d);
struct json_object* json_object_new_array(void);
struct json_object* json_object_new_string(const char *s);
struct json_object* json_object_new_string_len(const char *s, int len);
json_object_new_XXX系列函數用來創建XXX類型的json對象,創建的json對象默認引用計數為1,因此在該對象使用完后也需要調用一次json_object_put來把引用計數置0,從而釋放內存。
3. json_tokener_parse函數?
struct json_object* json_tokener_parse(const char *str);
json_tokener_parse將符合json格式的字符串構造為一個json對象,構造的json對象默認引用計數為1,同樣需要在使用完后對該對象調用一次json_object_put。
4. is_error宏
is_error(jso)
如果傳入的字符串是非法的json格式,錯誤判斷應該使用is_error宏,而非 if(NULL != jso),CGI中目前有很多這種錯誤用法(雖然好像沒引發什么問題)
5. json_object_object_XXX函數
void json_object_object_del(struct json_object* jso, const char *key);
從jso對象中刪除鍵值為key的子對象,并釋放該子對象及鍵值所占的內存(注:可能有文檔說json_object_object_del只是刪除而不釋放內存,但實際上這是錯誤的)。
struct json_object* json_object_object_get(struct json_object* jso, const char *key); 從jso中獲取鍵值為key的子對象。錯誤判斷同樣應該用is_error(jso)宏。
void json_object_object_add(struct json_object* jso, const char *key, struct json_object *val); 更新鍵值為key的子項的值。整個過程實際上是這樣的:先從jso中刪除并釋放鍵值key及其值的內存,然后重新分配內存添加鍵值和新的值,所以json_object_object_add是包含json_object_object_del操作的。
6. json_object_get_XXX系列函數?
struct lh_table* json_object_get_object(struct json_object *jso);
const char* json_object_get_string(struct json_object *jso);
int json_object_get_int(struct json_object *jso);
double json_object_get_double(struct json_object *jso); 這類函數只是獲取json對象的實際數據內容,不更新引用計數,也不分配內存。
7. json_object_array_XXX系列函數
struct json_object* json_object_array_get_sub_array(struct json_object *jso, int start_idx, int number);
這個函數用來從一個json數組對象中取數組序號start_idx開始的、總共number長度的子數組對象。分頁顯示功能常用到。注:返回的子數組是有重新分配內存的,所以同樣要對返回的json_object*做一次json_object_put操作來釋放內存。
int json_object_array_add(struct json_object *jso,struct json_object *val); 向數組中添加一個值。
int json_object_array_length(struct json_object *jso); 獲取數組長度。
int json_object_array_put_idx(struct json_object *jso, int idx, struct json_object *val); 更新數組中序號為idx那一項的值,老的值同樣會先被釋放。
struct json_object* json_object_array_get_idx(struct json_object *jso, int idx); 獲取數組中序號為idx那一項的json對象,不更新引用計數,也不分配內存。
struct json_object* json_object_array_sort(struct json_object *jso, const char *keyname, int sord ); 根據鍵值為keyname的項的值進行升序或降序排序,只是改變數組成員的順序,不更新引用計數,也不分配內存。
總結
以上是生活随笔為你收集整理的json-c库使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: google mock分享
- 下一篇: 安装/卸载GDB