JSON with C program

來源:互聯網
上載者:User

標籤:否則   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.