json-c 的安装和使用(使用json-c读取文件中的json数据和保存json格式的数据至文件中)
来源:互联网 发布:js遍历二维数组 编辑:程序博客网 时间:2024/06/05 02:28
1、json数据格式和json-c简介[1]
JSON(JavaScriptObject Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
跟XML相比,JSON的优势在于格式简洁短小,特别是在处理大量复杂数据的时候,这个优势便显得非常突出。从各浏览器的支持来看,JSON解决了因不同浏览器对XMLDOM解析方式不同而引起的问题。
JSON库多种多样,但是JSON-C由于兼容性好,支持UTF-8,所以使用比较广泛。
就json来说,由于结构比较简单,不用库也是可以的。
但json-c提供了超出json范围的一些功能,实际上完成了数据序列化和反序列化,数据的存储和检索,数据对象化等功能。还是非常有使用价值的。
2、json-c库的安装:
参考于https://github.com/json-c/json-c/wiki[2]
[1]下载json-c并解压:
进入[2]网址并下载最新的json-c压缩包:
Fetchrelease tarballs fromthedownloads page (Amazon S3).
选择json-c-0.9.tar.gz下载(截止到2017/9/19日这个是最新的)。
解压压缩包:#tar -xzvf json-c-0.9.tar.gz
进入文件夹:#cdjson-c-0.9
[2]编译并安装(注意权限,权限不够请使用sudo):
#./configure–prefix=/some/install/path
/some/install/path是你的json-c安装路径,我使用的是/usr/include
再执行
#make
#makecheck
#makeinstall
进行编译安装
[3]查看是否安装成功:
#cd/usr/include/json
进入该文件夹查看里面有json的相关文件,说明安装成功了。
3、json-c的使用
json-c库函数使用起来较为简单:
申请json对象(以infor_object为例):
structjson_object *infor_object = NULL;
infor_object= json_object_new_object();
释放json对象:
json_object_put(infor_object);
添加json值类型到数组中
json_object_array_add(array_object,json_object_new_int(256));
json_object_array_add(array_object,json_object_new_int(257));
json_object_array_add(array_object,json_object_new_int(258));
json_object_object_add(para_object,"DeviceId", json_object_new_string("sn_iso_9000"));
json_object_object_add(para_object,"MacAddr", json_object_new_string("AA:BB:CC:DD:EE:FF"));
json_object_object_add(para_object,"Visible", json_object_new_int(1));
添加json名称和值到json对象集合中
json_object_object_add(infor_object,"method", json_object_new_string("GetSystemInfo"));
json_object_object_add(infor_object,"param", para_object);
json_object_object_add(infor_object,"id", json_object_new_string("101"));
添加数组集合到json对象中
json_object_object_add(infor_object,"array", array_object);
下面是实例:
#include <stdio.h> #include <json/json.h> #include <stdlib.h>void test_jsonc() { struct json_object *infor_object = NULL; infor_object = json_object_new_object(); if (NULL == infor_object) { printf("new json object failed.\n"); return; } struct json_object *para_object = NULL; para_object = json_object_new_object(); if (NULL == para_object) { json_object_put(infor_object);//free printf("new json object failed.\n"); return; } struct json_object *array_object = NULL; array_object = json_object_new_array(); if (NULL == array_object) { json_object_put(infor_object);//free json_object_put(para_object);//free printf("new json object failed.\n"); return; } /*添加json值类型到数组中*/ json_object_array_add(array_object, json_object_new_int(256)); json_object_array_add(array_object, json_object_new_int(257)); json_object_array_add(array_object, json_object_new_int(258)); json_object_object_add(para_object, "DeviceId", json_object_new_string("sn_iso_9000")); json_object_object_add(para_object, "MacAddr", json_object_new_string("AA:BB:CC:DD:EE:FF")); json_object_object_add(para_object, "Visible", json_object_new_int(1)); /*添加json名称和值到json对象集合中*/ json_object_object_add(infor_object, "method", json_object_new_string("GetSystemInfo")); json_object_object_add(infor_object, "param", para_object); json_object_object_add(infor_object, "id", json_object_new_string("101")); /*添加数组集合到json对象中*/ json_object_object_add(infor_object, "array", array_object); json_object_to_file("1.json",infor_object); struct json_object *result_object = NULL; result_object = json_object_object_get(infor_object, "method"); printf("-----------result_object method ---------------------------\n"); printf("%s\n", json_object_to_json_string(result_object)); printf("-----------result_object method---------------------------\n"); result_object = json_object_object_get(infor_object, "param"); printf("-----------result_object param ---------------------------\n"); printf("%s\n", json_object_to_json_string(result_object)); printf("-----------result_object param---------------------------\n"); result_object = json_object_object_get(infor_object, "array"); printf("-----------result_object array---------------------------\n"); printf("%s\n", json_object_to_json_string(result_object)); printf("-----------result_object array---------------------------\n"); int i; for(i = 0; i < json_object_array_length(result_object); i++) { struct json_object *obj = json_object_array_get_idx(result_object, i); printf("\t[%d]=%s\n", i, json_object_to_json_string(obj)); } struct json_object *file_object = NULL; unsigned int filesize = 0; FILE *fp; fp = fopen("1.json", "r"); fseek(fp, 0L, SEEK_END); filesize = ftell(fp); printf("filesize is %d \n",filesize); fclose(fp); FILE *fp2; char *file; fp2 = fopen("1.json", "r"); file = (char *)malloc(filesize + 1); fseek(fp2, SEEK_SET, 0); fread(file,1,filesize,fp2); file_object = json_tokener_parse(file); fclose(fp2); json_object_to_file("2.json",file_object); printf("-----------json infor ---------------------------\n"); printf("%s\n", json_object_to_json_string(infor_object)); printf("-----------json infor ---------------------------\n"); json_object_put(infor_object);//free json_object_put(file_object);//free } int main(int argc, char *argv[]) { test_jsonc(); return 0; }
其中:
structjson_object *file_object = NULL;
unsignedint filesize = 0;
FILE*fp;
fp= fopen("1.json", "r");
fseek(fp,0L, SEEK_END);
filesize= ftell(fp);
printf("filesizeis %d \n",filesize);
fclose(fp);
获取了1.json的文件大小,在下面的代码中读取1.json的数据并存至2.json文件中。
FILE*fp2;
char*file;
fp2= fopen("1.json", "r");
file= (char *)malloc(filesize + 1);
fseek(fp2,SEEK_SET, 0);
fread(file,1,filesize,fp2);
file_object= json_tokener_parse(file);
fclose(fp2);
json_object_to_file("2.json",file_object);
将文件转为json格式:
file_object= json_tokener_parse(file);
将json格式转为文件:
json_object_to_file("2.json",file_object);
PS:编译的时候一定要依赖json库:
gcc-o target test.c -ljson
程序运行结果:
-----------result_objectmethod ---------------------------
"GetSystemInfo"
-----------result_objectmethod---------------------------
-----------result_objectparam ---------------------------
{"DeviceId": "sn_iso_9000", "MacAddr":"AA:BB:CC:DD:EE:FF", "Visible": 1 }
-----------result_objectparam---------------------------
-----------result_object array---------------------------
[256, 257, 258 ]
-----------result_objectarray---------------------------
[0]=256
[1]=257
[2]=258
filesizeis 156
-----------jsoninfor ---------------------------
{"method": "GetSystemInfo", "param": {"DeviceId": "sn_iso_9000", "MacAddr":"AA:BB:CC:DD:EE:FF", "Visible": 1 }, "id":"101", "array": [ 256, 257, 258 ] }
-----------jsoninfor ---------------------------
同时可执行程序的目录下会生成1.json和2.json文件
内容相同:
#cat1.json
{"method": "GetSystemInfo", "param": {"DeviceId": "sn_iso_9000", "MacAddr":"AA:BB:CC:DD:EE:FF", "Visible": 1 }, "id":"101", "array": [ 256, 257, 258 ]}gy@gy-E42-80:~/My_test/json_test$
参考文章:
[1]json-c例子http://blog.csdn.net/lanyang123456/article/details/41909369
[2]linux安装json-chttp://www.cnblogs.com/LubinLew/p/Linux_JSON-C_Install.html
- json-c 的安装和使用(使用json-c读取文件中的json数据和保存json格式的数据至文件中)
- 【C++】JSON文件的读取和生成
- 【C++】JSON文件的读取和生成
- 【C++】JSON文件的读取和生成
- 【C++】JSON文件的读取和生成
- 使用JSON文件读取数据
- C++json文件的使用
- js读取json文件中的json数据
- 读取 Json 文件中的数据
- Unity 使用JSON实现本地数据保存和读取
- Json数据解析和生成(C/C++, 使用CJson)
- json中有格式的保存文件
- Json文件 使用rapidjson获取Json数据
- Json文件 使用rapidjson获取Json数据
- JSON数据的格式和解析(使用GSON)入门
- 使用JSON读取和显示数据
- Python 以txt格式保存和读取json数据
- Python 以mongo格式保存和读取json数据
- 行为识别笔记:iDT算法用法与代码解析
- 使用AlloyFinger(移动端点触插件)
- MySQL 触发器简单实例
- XtraReport显示行序号
- linux下vi命令大全
- json-c 的安装和使用(使用json-c读取文件中的json数据和保存json格式的数据至文件中)
- 简单的实现一个类似于Cocos2dx的游戏框架——导演、场景、层、精灵(已填坑5%)
- 字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
- Crash收集的方式
- 用Spring Cloud和Docker构建微服务
- CSS中height:100%和height:inherit的异同
- js实现Draggable拖拽功能
- [2014]Sequence to Sequence Learning with Neural Networks
- Gson解析报错解决方案