Jansson是用于编码,解码和生成JSON数据的C语言库。它的特性:

  • 简单直观的API和数据模型
  • 全面的文档
  • 不依赖其他库
  • 全面支持Unicode(UTF-8)
  • 大量测试套件

0.下载jansson  https://github.com/akheron/jansson/releases

1.安装jansson

1

2

3

./configure

make

make install

2.编程

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()函数。如下例子:

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 256struct 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));
#endifiter = 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 0iter = 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]));}
#endifjson_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

linux c 解析生成json(jansson安装和使用)相关推荐

  1. 使用jsoncpp解析生成json

    在此站点下载jsoncpp(https://sourceforge.net/projects/jsoncpp/这个站点的版本较旧) 在电脑上安装Python,运行amalgamate.py,生成的di ...

  2. C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档

    Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...

  3. java json插件安装_IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体...

    前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...

  4. mysql 动态sql 解析json数据_在SQL 中生成JSON数据

    这段时间接手一个数据操作记录的功能,刚拿到手上的时候打算用EF做,后来经过仔细考虑最后还是觉定放弃,最后思考再三决定: 1.以模块为单位分表.列固定(其实可以所有的操作记录都放到同一个表,但是考虑到数 ...

  5. java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串

    文章目录 1. 详说json 1.1 何为json 1.2 json语法 2. Java解析与生成JSON的四种方式 2.1 传统方式 2.2 利用Jackson方式 2.3 利用Gson方式 2.4 ...

  6. java 生成json数据_解析和生成JSON数据

    JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值.它对外部(External: 应用toString()方法输出的数值)调 ...

  7. iOS json解析 和生成json串

    1.生成json字符串 NSData * jsonData = [NSJSONSerialization dataWithJSONObject:detailDic options:0 error:ni ...

  8. Go Web编程--解析JSON请求和生成JSON响应

    现在无论是网站.App.小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的.因为在结合可读性.编码数据大小和开发者使用难度上都JSON格式是一个比较好的 ...

  9. python json库安装_jsonc库的安装以及简单使用

    if 0 1:cpp在linux下的配置 JSON 官方的解释为:JSON 是一种轻量级的数据传输格式. 关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org. ...

最新文章

  1. 10.6 捕获处理异常
  2. WebService入门教程_Schema学习
  3. LINQ to SQL语句(1)之Where
  4. 修改intellij(idea)中mybatis对应的xml背景颜色
  5. 服务器能做镜像文件吗,如何给服务器做镜像
  6. java 算法 福尔摩斯的约会
  7. 湖南省第六届大学生计算机程序设计竞赛---数字整除
  8. java运行提示runtime,Java 执行运行时命令 Runtime
  9. 跨网段局域网如何互通_如何实现局域网中不同网段互访?企业网必备的高级静态路由...
  10. 类似taobao的多彩选项卡tab
  11. ADS8364 VHDL程序正式版
  12. 爆销产品标题怎么写_7个让销量暴增的商品标题文案套路
  13. 在eclipse中编写HDFS的Java程序
  14. 赫茨伯格的双因素理论
  15. 181008 逆向-inctf(load3r、Decoy)
  16. Chemistry Methods | Image2SMILES+: Transformer-Based Molecular Optical Recognition Engine
  17. 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。
  18. html超链接并可以返回,返回到上一页的html代码的几种写法
  19. 解决删除chrome注册表残留问题
  20. java集合入门和深入学习

热门文章

  1. 液晶显示原理与ILI9341的使用
  2. Android 插件化原理学习 —— Hook 机制之动态代理
  3. webpack初探——js打包
  4. promise和Angular中的 $q, defer
  5. iOS进程间通信之CFMessagePort
  6. 使用Mock.js进行独立于后端的前端开发
  7. 经过五年测试 维基利用HTML5迈入视频时代
  8. 在SQL Server 2005中实现表的行列转换()
  9. 从技术人视角看闪电网络之微支付通道
  10. 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?