linux 下jansson安装和使用

1.安装jansson

1
2
3
./configure
make
make install

2.生成帮助文档

1
2
cd doc 
make html

编译安装doc时提示 spinx-build not a command

执行下面语句安装sphinx

1
easy_install -U Sphinx

生成_build文件夹  

1
cd _build/html/

使用火狐浏览器启动帮助文档    

1
Firefox index.html

3.编程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
包含头文件: #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()函数的帮助。如下例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);

//下面的是处理字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}

  

 

下面的程序是从一个jason文件中取出内容。

tmp.json文件中的内容是:

{"name1": "value1", "name2": "value2", "name3": "value3", "name4": "value4"}

 vim test.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值