標籤:否則 ons 長度 token void 更新 引用 內容 sub
1. json_object_get與json_object_put函數 struct json_object* json_object_get(struct json_object *jso); // 將jso對象的引用計數加1,返回jso自身
void json_object_put(struct json_object *jso); // 將jso對象的引用計數減1。此時如果jso的引用計數大於0,直接返回; 如果jso的引用計數為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); 這類函數只是擷取jso對象的實際資料內容,不更新引用計數,也不分配記憶體。
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 with C program