json-c 的安装和使用(使用json-c读取文件中的json数据和保存json格式的数据至文件中)

来源:互联网 发布:js遍历二维数组 编辑:程序博客网 时间:2024/06/05 02:28

1json数据格式和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范围的一些功能,实际上完成了数据序列化和反序列化,数据的存储和检索,数据对象化等功能。还是非常有使用价值的。


2json-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的相关文件,说明安装成功了。


3json-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.json2.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