linux 下jansson安裝和使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM