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 from thedownloads 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
#include
#include
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