json 라이브러리 함수 입문 예, 상해.C 언어

8360 단어 Json
//역시 많은 손을 써서 총결산을 해야 한다. 부족한 점은 일깨워 주기를 바란다.컴파일할 때, -ljson 라이브러리를 추가하는 것을 기억해라
#include
#include "json/json.h"

void make_a_common_json_string();

int main()
{
	struct json_object *my_obj;
	//json      ,\"string\".(        )
	char *str="{\"abc\": 123, \"wds\": 12.3, \"qwe\": \"ddd\", \"bool0\": false, \"bool1\": true, \"arr\": [12, 3, 0, 5, null]}";
	//   json           json  
	my_obj = json_tokener_parse(str);
	printf("1-tokener parse: %s
", json_object_to_json_string(my_obj)); // key , key:value. json_object_object_del(my_obj, "abc"); printf("2-tokener parse: %s
", json_object_to_json_string(my_obj)); struct json_object *ret_obj; // key , value ret_obj = json_object_object_get(my_obj, "wds"); printf("obj_get-wds:%s
", json_object_to_json_string(ret_obj)); // json_object_object_get 。 // jso 1, 0 。 json_object_put(ret_obj); // json ,int.double.string.array.object. struct json_object *val = json_object_new_int(18542); // key:value my_obj . json_object_object_add(my_obj, "wds", val); printf("3-object add: %s
", json_object_to_json_string(my_obj)); // function 1 json_object_put(val); printf("get string:%s
", json_object_get_string(my_obj)); printf("get lh:%d
", json_object_get_object(my_obj)); printf("get int:%d
", json_object_get_int(my_obj)); make_a_common_json_string(); // function 1 json_object_put(my_obj); return 0; } // , (array, int, string, object)。 json ,socket , , 。 void make_a_common_json_string() { printf("####################################
"); int i=0; struct json_object *obj_all = json_object_new_object(); struct json_object *obj_info = json_object_new_object(); struct json_object *obj_work = json_object_new_object(); struct json_object *obj_life = json_object_new_object(); struct json_object *arr_month_grade = json_object_new_array(); for(i=1; i<13; i++){ struct json_object *obj_int = json_object_new_int(i); json_object_array_add(arr_month_grade, obj_int); } //const char *str = "{\" \": \"programmer\", \" \": \" \", \"addres\": \"BJ.3\"}"; //json_object *obj_str = json_tokener_parse(str); json_object_object_add(obj_work, "position", json_object_new_string("programmer")); json_object_object_add(obj_work, "department", json_object_new_string("make code")); json_object_object_add(obj_work, "address", json_object_new_string("BJ.3.103")); json_object_object_add(obj_work, "mounth_grade", arr_month_grade); json_object_object_add(obj_info, "Work", obj_work); json_object_object_add(obj_life, "Name", json_object_new_string("DS.wen")); json_object_object_add(obj_life, "Age", json_object_new_int(24.34)); json_object_object_add(obj_life, "M-O", json_object_new_string("Male")); json_object_object_add(obj_info, "Life", obj_life); json_object_object_add(obj_all,"W.DS_Info", obj_info); printf("all_string:%s
", json_object_to_json_string(obj_all)); json_object_put(obj_all); return ; }
/*************************************    ********************************************/
1-tokener parse: { "abc": 123, "wds": 12.300000, "qwe": "ddd", "bool0": false, "bool1": true, "arr": [ 12, 3, 0, 5, null ] }
2-tokener parse: { "wds": 12.300000, "qwe": "ddd", "bool0": false, "bool1": true, "arr": [ 12, 3, 0, 5, null ] }
obj_get-wds:12.300000
3-object add: { "wds": 18542, "qwe": "ddd", "bool0": false, "bool1": true, "arr": [ 12, 3, 0, 5, null ] }
get string:{ "wds": 18542, "qwe": "ddd", "bool0": false, "bool1": true, "arr": [ 12, 3, 0, 5, null ] }
get lh:26383664
get int:0
####################################
all_string:{ "W.DS_Info": { "Work": { "position": "programmer", "department": "make code", "address": "BJ.3.103", "mounth_grade": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] }, "Life": { "Name": "DS.wen", "Age": 24, "M-O": "Male" } } }
/********************************************************************************************************************/

/-----------------------------function--------------------------------------/
1. struct json_object * * json_object_get(struct json object* this) 설명: 객체 참조 수를 증가시킵니다.c 라이브러리를 사용하는 데 가장 관심 있는 것은 메모리를 누가 분배하고 누가 방출하는가이다.jsonc의 메모리 관리 방식은 인용 계수를 기반으로 하는 메모리 트리 (체인) 입니다. 만약 struct jsonobject 대상 a,add가 다른 대상 b에 있으면 현식 방출(json object put)a를 사용하지 않는다. a를 b의 대상 트리에 걸고 b를 방출할 때 a를 방출한다. a가dd가 b에 있고 또dd가 대상 c에 있을 때 a를 두 번 방출(double free)한다. 이때 a의 인용 계수(호출 함수 json object get(a)를 증가시킬 수 있다. 이때 b를 먼저 방출하고 c를 방출하면 a의 인용 계수를 증가시킬 수 있다.b를 방출할 때 a를 진정으로 방출하지 않고 a의 인용 계수를 1로 줄이고 c를 방출할 때 a. 매개 변수:this-json 대상 Void jsonobject_put(struct json object* this) 설명: 객체의 참조 횟수를 한 번 줄이고 0으로 줄이면 (free) 자원 매개 변수:this – json 객체
주: 만약 json 대상에 json 을 현식으로 호출했다면object_get, 다음에 json 쌍으로 호출해야 합니다object_put, 그렇지 않으면 이 json 대상이 차지하는 메모리 유출을 초래할 수 있습니다.2. json_object_new_XXX 시리즈 함수 struct jsonobject* 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 jsonobject* json_tokener_parse(const char *str); json_tokener_parse는 json 형식에 맞는 문자열을 하나의 json 대상으로 구성합니다. 구성된 json 대상의 기본 인용 계수는 1입니다. 마찬가지로 사용이 끝난 후에 이 대상에 json 을 한 번 호출해야 합니다.object_put. 4. is_error 宏iserror (jso) 전송된 문자열이 불법 json 형식이면 오류 판단은 is 를 사용해야 합니다error 매크로, if (NULL! = jso) 가 아니라 CGI에 현재 많은 오류 사용법이 있습니다.json_object_object_XXX 함수 void jsonobject_object_del(struct json_object* jso, const char *key); jso 대상에서 키 값이 키인 하위 대상을 삭제하고 키 값과 키 값이 차지하는 메모리를 방출합니다. (주: json object object del은 메모리를 방출하지 않고 삭제한다고 말하는 문서가 있을 수 있지만, 사실상 잘못된 것입니다.)struct json_object* json_object_object_get(struct json_object* jso, const char *key); jso에서 키 값이 키인 하위 대상을 가져옵니다.잘못된 판단 역시 iserror 매크로.void json_object_object_add(struct json_object* jso, const char *key, struct json_object *val); 키 값이 키인 하위 항목의 값을 업데이트합니다.전체 과정은 사실상 이렇다. 먼저 jso에서 키 값의 키와 그 값의 메모리를 삭제하고 방출한 다음에 메모리를 재분배하여 키 값과 새로운 값을 추가하기 때문에 jsonobject_object_add는 json 포함object_object_del 조작의6. json_object_get_XXX 시리즈 함수 struct lhtable* 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 jsonobject* json_object_array_get_sub_array(struct json_object *jso, int start_idx, int number); 이 함수는 json 그룹 대상에서 그룹 번호를 추출하는 데 사용됩니다 startidx에서 시작한 총 number 길이의 하위 그룹 대상입니다.페이지 디스플레이 기능이 자주 사용됩니다.주: 되돌아오는 하위 그룹은 메모리를 재분배하기 때문에 되돌아오는 jsonobject* 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 ); 키 값이 키name인 항목의 값을 오름차순 또는 내림차순으로 정렬합니다. 그룹 구성원의 순서만 바꾸고 인용계수를 업데이트하지 않으며 메모리도 분배하지 않습니다.

좋은 웹페이지 즐겨찾기