linux c 解析生成json(jansson安装和使用)
Jansson是用于编码,解码和生成JSON数据的C语言库。它的特性:
- 简单直观的API和数据模型
- 全面的文档
- 不依赖其他库
- 全面支持Unicode(UTF-8)
- 大量测试套件
0.下载jansson https://github.com/akheron/jansson/releases
1.安装jansson
1 2 3 |
|
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 |
|
我主要是使用字符串的形式,参考的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安装和使用)相关推荐
- 使用jsoncpp解析生成json
在此站点下载jsoncpp(https://sourceforge.net/projects/jsoncpp/这个站点的版本较旧) 在电脑上安装Python,运行amalgamate.py,生成的di ...
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...
- java json插件安装_IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体...
前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...
- mysql 动态sql 解析json数据_在SQL 中生成JSON数据
这段时间接手一个数据操作记录的功能,刚拿到手上的时候打算用EF做,后来经过仔细考虑最后还是觉定放弃,最后思考再三决定: 1.以模块为单位分表.列固定(其实可以所有的操作记录都放到同一个表,但是考虑到数 ...
- 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 ...
- java 生成json数据_解析和生成JSON数据
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值.它对外部(External: 应用toString()方法输出的数值)调 ...
- iOS json解析 和生成json串
1.生成json字符串 NSData * jsonData = [NSJSONSerialization dataWithJSONObject:detailDic options:0 error:ni ...
- Go Web编程--解析JSON请求和生成JSON响应
现在无论是网站.App.小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的.因为在结合可读性.编码数据大小和开发者使用难度上都JSON格式是一个比较好的 ...
- python json库安装_jsonc库的安装以及简单使用
if 0 1:cpp在linux下的配置 JSON 官方的解释为:JSON 是一种轻量级的数据传输格式. 关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org. ...
最新文章
- 10.6 捕获处理异常
- WebService入门教程_Schema学习
- LINQ to SQL语句(1)之Where
- 修改intellij(idea)中mybatis对应的xml背景颜色
- 服务器能做镜像文件吗,如何给服务器做镜像
- java 算法 福尔摩斯的约会
- 湖南省第六届大学生计算机程序设计竞赛---数字整除
- java运行提示runtime,Java 执行运行时命令 Runtime
- 跨网段局域网如何互通_如何实现局域网中不同网段互访?企业网必备的高级静态路由...
- 类似taobao的多彩选项卡tab
- ADS8364 VHDL程序正式版
- 爆销产品标题怎么写_7个让销量暴增的商品标题文案套路
- 在eclipse中编写HDFS的Java程序
- 赫茨伯格的双因素理论
- 181008 逆向-inctf(load3r、Decoy)
- Chemistry Methods | Image2SMILES+: Transformer-Based Molecular Optical Recognition Engine
- 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。
- html超链接并可以返回,返回到上一页的html代码的几种写法
- 解决删除chrome注册表残留问题
- java集合入门和深入学习
热门文章
- 液晶显示原理与ILI9341的使用
- Android 插件化原理学习 —— Hook 机制之动态代理
- webpack初探——js打包
- promise和Angular中的 $q, defer
- iOS进程间通信之CFMessagePort
- 使用Mock.js进行独立于后端的前端开发
- 经过五年测试 维基利用HTML5迈入视频时代
- 在SQL Server 2005中实现表的行列转换()
- 从技术人视角看闪电网络之微支付通道
- 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?