zoukankan      html  css  js  c++  java
  • 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
    ",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
    ");
    return JSON_OBJECT;
    }
    
    if(json_is_array(value))
    {
    printf("json_is_array
    ");
    return JSON_ARRAY;
    }
    
    if(json_is_string(value))
    {
    printf("json_is_string
    ");
    return JSON_STRING;
    }
    
    if(json_is_integer(value))
    {
    printf("json_is_integer
    ");
    return JSON_INTEGER;
    }
    
    if(json_is_real(value))
    {
    printf("json_is_real
    ");
    return JSON_REAL;
    }
    
    if(json_is_number(value))
    {
    printf("json_is_number
    ");
    }
    
    if(json_is_boolean(value))
    {
    printf("json_is_boolean
    ");
    }
    
    if(json_is_null(value))
    {
    printf("json_is_null
    ");
    return JSON_NULL;
    }
    
    if(json_is_true(value))
    {
    printf("json_boolean(1)
    ");
    return JSON_TRUE;
    }
    
    if(json_is_false(value))
    {
    printf("json_boolean(0)
    ");
    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
    ", size);
    /* 取出object中的值 */
    //struct policy iter_get_value(json_t *object)
    char *result;
    result = json_dumps(object, JSON_PRESERVE_ORDER);
    printf("result=%s
    ", result);
    /* 判断读取的jansson类型 */
    printf("判断是什么类型
    ");
    my_json_type(object);
    printf("result_size = %d
    ", 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
    ", i,json_string_value(iter_values[i]));
    
    if((iter = json_object_iter_next(object, iter)) == NULL)
    {
    //printf("iterate end
    ");
    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
    ", 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
    ", policyinfo.keyword[i]);
    printf ("value = %s
    ", policyinfo.keycount[i]);
    i++;
    }
    }
    #endif
    

      

    编译:

    gcc test.c -ljansson

  • 相关阅读:
    再谈Asp.Net页面生命周期
    多线程、方便扩展的Windows服务程序框架
    用NuGet.Server管好自家的包包
    github for Windows
    MongoVUE 15天试用期解决办法
    NET插件系统——提升系统搜索插件和启动速度的思考
    Visual Studio Ultimate 2012 RC 安装手记
    自动完成菜单
    HBase
    WCF消息可靠性于有序传递
  • 原文地址:https://www.cnblogs.com/etangyushan/p/3724017.html
Copyright © 2011-2022 走看看