1.安裝jansson
./configure make make install
2.生成幫助文檔
cd doc make html
編譯安裝doc時提示 spinx-build not a command
執行下面語句安裝sphinx
easy_install -U Sphinx
生成_build文件夾
cd _build/html/
使用火狐瀏覽器啟動幫助文檔
Firefox index.html
3.編程
包含頭文件: #include <jansson.h> 編譯連接時加庫 -ljansson gcc –o source source.c –ljansson 如果執行程序出現:error while loading shared libraries: libjansson.so.4: cannot open shared object file: No such file or directory 找不到libjansson.so.4這個庫時用下面方法解決 //查找libjansson.so.4所在位置 Whereis libjansson 顯示:libjansson: /usr/local/lib/libjansson.a /usr/local/lib/libjansson.la /usr/local/lib/libjansson.so 自己的libjansson.so所在位置為:/usr/local/lib/libjansson.so //確定libjansson.so是否真的存在 cd /usr/local/lib //如果存在,執行下面語句,創建一個libjansson.so的符號鏈接到/usr/lib目錄下 ln -s /usr/local/lib/libjansson.so /usr/lib/libjansson.so.4 //重新加載庫 ldconfig 常用接口函數: json_t *json_string(const char *value) 返回一個json string的數據類型,轉換成這個庫可以識別的格式。錯誤返回NULL,必須是UTF-8格式的。 Return value: New reference. Returns a new JSON string, or NULL on error. value must be a valid UTF-8 encoded Unicode string. json_t *json_string_nocheck(const char *value) 與json_string()相同,不檢查value的有效性 Return value: New reference. Like json_string(), but doesn’t check that value is valid UTF-8. Use this function only if you are certain that this really is the case (e.g. you have already checked it by other means). const char *json_string_value(const json_t *string) 返回json string中的字符串,是c語言的字符串。 Returns the associated value of string as a null terminated UTF-8 encoded string, or NULL if string is not a JSON string. The retuned value is read-only and must not be modified or freed by the user. It is valid as long as string exists, i.e. as long as its reference count has not dropped to zero. int json_string_set(const json_t *string, const char *value) 設置string對應的值,如果value是無效的UTF-8值,設置失敗。 Sets the associated value of string to value. value must be a valid UTF-8 encoded Unicode string. Returns 0 on success and -1 on error. int json_string_set_nocheck(const json_t *string, const char *value) 與json_string_set()相同,只是不檢查value是否是有效的UTF-8類型 Like json_string_set(), but doesn’t check that value is valid UTF-8. Use this function only if you are certain that this really is the case (e.g. you have already checked it by other means).
我主要是使用字符串的形式,參考的jansson-2.6/test/suites/api/test_object.c代碼
下面的程序功能是:輸出一個json格式的字符串,gcc 的時候別忘了加 -ljansson
需要特別注意的地方時jansson數組的處理,在需要循環的加入數組的時候需要使用 json_deep_copy()函數。如下例子:
json_t copy; json_t object; json_t array; json_object_set_new (object, "test", json_string("testvalue1")); copy = json_deep_copy(object); json_array_append(arr, copy); json_object_set_new (object, "test", json_string("testvalue2")); copy = json_deep_copy(object); json_array_append(arr, copy);
//下面的是處理字符串
#include <stdio.h> #include <jansson.h> int event_jansson() { json_t *objectmsg; char *result; objectmsg = json_object(); json_object_set_new (objectmsg, "inc", json_string("value-incID")); json_object_set_new (objectmsg, "src", json_string("a")); json_object_set_new (objectmsg, "des", json_string("b")); json_object_set_new (objectmsg, "protocol", json_string("c")); json_object_set_new (objectmsg, "policy", json_string("d")); json_object_set_new (objectmsg, "snapshot", json_string("e")); json_object_set_new (objectmsg, "name", json_string("f")); json_object_set_new (objectmsg, "Type", json_string("g")); json_object_set_new (objectmsg, "Path", json_string("h")); json_object_set_new (objectmsg, "domain", json_string("i")); result = json_dumps(objectmsg, JSON_PRESERVE_ORDER); printf("result=%s\n",result); free(result); json_decref(objectmsg); return 0; } int main() { event_jansson(); return 0; }
下面的程序是從一個json文件中取出內容。
tmp.json文件中的內容是:
{"name1": "value1", "name2": "value2", "name3": "value3", "name4": "value4"}
vim test.c
#include <string.h> #include <stdio.h> #include <jansson.h> /* 關鍵字個數 */ #define COUNTMAX 256 /* 關鍵字長度 */ #define LENMAX 256 struct policymsg { int size; char keyword[COUNTMAX][LENMAX]; char keycount[COUNTMAX][LENMAX]; }; /* 判斷janson的類型 */ int my_json_type(json_t *value) { if(json_is_object(value)) { printf("json_is_object\n"); return JSON_OBJECT; } if(json_is_array(value)) { printf("json_is_array\n"); return JSON_ARRAY; } if(json_is_string(value)) { printf("json_is_string\n"); return JSON_STRING; } if(json_is_integer(value)) { printf("json_is_integer\n"); return JSON_INTEGER; } if(json_is_real(value)) { printf("json_is_real\n"); return JSON_REAL; } if(json_is_number(value)) { printf("json_is_number\n"); } if(json_is_boolean(value)) { printf("json_is_boolean\n"); } if(json_is_null(value)) { printf("json_is_null\n"); return JSON_NULL; } if(json_is_true(value)) { printf("json_boolean(1)\n"); return JSON_TRUE; } if(json_is_false(value)) { printf("json_boolean(0)\n"); return JSON_FALSE; } } struct policymsg get_policy_json(char *jsonfile) { struct policymsg policyinfo; int i, size; void *iter; json_t *object; json_t *iter_values; json_error_t error; object = json_object(); object = json_load_file (jsonfile, 0, &error); policyinfo.size = json_object_size (object); #if 0 //size = json_object_size (object); //printf("size=%d\n", size); /* 取出object中的值 */ //struct policy iter_get_value(json_t *object) char *result; result = json_dumps(object, JSON_PRESERVE_ORDER); printf("result=%s\n", result); /* 判斷讀取的jansson類型 */ printf("判斷是什么類型\n"); my_json_type(object); printf("result_size = %d\n", strlen(result)); #endif iter = json_object_iter(object); i = 0; while(1) { strcpy (policyinfo.keyword[i], json_object_iter_key(iter)); iter_values = json_object_iter_value(iter); strcpy (policyinfo.keycount[i],json_string_value(iter_values)); //printf("values[%d]=%s\n", i,json_string_value(iter_values[i])); if((iter = json_object_iter_next(object, iter)) == NULL) { //printf("iterate end\n"); break; } i++; } #if 0 iter = json_object_iter_at(object, "b"); if(iter) { iter_keys[i] = json_object_iter_key(iter); iter_values[i] = json_object_iter_value(iter); printf("values[%d]=%s\n", i,json_string_value(iter_values[i])); } #endif json_decref(object); return policyinfo; } #if 1 int main() { //result = "{\"objectmsg\": \"{\"name1\": \"value1\", \"name2\": \"value2\", \"name3\": \"value3\", \"name4\": \"value4\"}\", \"name5\": \"value6\"}"; //{"name1": "value1", "name2": "value2", "name3": "value3", "name4": "value4"} char *str = "./tmp.json"; struct policymsg policyinfo; policyinfo = get_policy_json(str); int i = 0; while ( i < policyinfo.size) { printf ("keyword = %s\n", policyinfo.keyword[i]); printf ("value = %s\n", policyinfo.keycount[i]); i++; } } #endif
編譯:
gcc test.c -ljansson