json-c 的安裝和使用(使用json-c讀取檔案中的json資料和儲存json格式的資料至檔案中)
1、json資料格式和json-c簡介[1]
JSON(JavaScriptObject Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。
JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C,C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。
跟XML相比,JSON的優勢在於格式簡潔短小,特別是在處理大量複雜資料的時候,這個優勢便顯得非常突出。從各瀏覽器的支援來看,JSON解決了因不同瀏覽器對XMLDOM解析方式不同而引起的問題。
JSON
就json來說,由於結構比較簡單,不用庫也是可以的。
但json-c提供了超出json範圍的一些功能,實際上完成了資料序列化和反序列化,資料的儲存和檢索,資料物件化等功能。還是非常有使用價值的。
2、json-c庫的安裝:
參考於https://github.com/json-c/json-c/wiki[2]
[1]下載json-c並解壓:
進入[2]網址並下載最新的json-c壓縮包:
選擇下載(截止到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 ]}[email protected]:~/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
相關推薦
c#開源工具(或者C# 開源框架)
stack windows 框架 ado doc 2.0 release dal .com 1.轉載聲明:本篇內容轉載自http://www.cnblogs.com/gaoyuchuanIT/articles/5612268.html。 2. C# 開源框架(整理)
C#:讀取html模板檔案,並替換修改檔案中指定值,儲存為修改後的檔案
1.準備html模板檔案:Pages/Device/DeviceModel8.html 2 using System.IO:讀取檔案內容,並替換指定內容 &nbs
Codeforces Round #511 (Div. 2) C. Enlarge GCD(消掉最少的數,讓所有數的最大公約數變大)
C. Enlarge GCD time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Mr. F
[C++]排序模板(含C++模板程式碼)
排序模板 一、插入排序 特點:stable sort、In-place sort 最優複雜度:當輸入陣列就是排好序的時候,複雜度為O(n),而快速排序在這種情況下會產生O(n^2)的複雜度。 最差複雜度:當輸入陣列為倒序時,複雜度為O(n^2) 插入排
如何寫cmake使其包含c++11特性 (-std=c++11如何寫進cmakeList.txt)
g++ 4.8.2 cmake 2.8 之前寫cmkae編譯帶有c++11特性的程式碼有這麼一句: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 但是總會出現cc1plus: error: unrecognized
MongoDB系列三:mongoDB C/C++驅動使用(New C++11 driver)
C++驅動的使用資料實在太少,應用過程中踩過不少坑,現將一些經驗整理下,共享給大家: 1、資料庫連線池: 官方提供的方法已經比較完善,簡單封裝了一下,方便使用 mongodb.h: #ifndef MongoDB_H #define MongoD
Docker安裝使用(拉取映象、新建容器、啟動容器、停止容器、刪除容器)
Docker操作相關命令 英文:https://docs.docker.com/engine/reference/commandline/docker/ 中文:http://www.runoob.com/docker/docker-command-manual.html 一、安
POJ 1050 To the Max 最大子矩陣和(二維的最大欄位和)
傳送門: To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52306 Accepted: 27646 Description Given a two-dimensional array of positive
json-c 的安裝和使用(使用json-c讀取檔案中的json資料和儲存json格式的資料至檔案中)
1、json資料格式和json-c簡介[1] JSON(JavaScriptObject Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C,C++
C#,讀取shp原始檔 ,將要素生成JSON格式(面圖層)
//轉換位位元組 大小位轉換 private int ChangeByteOrder(int indata) { &n
c實現功能(7)寫入和讀取文字檔案
#include <stdio.h> #include <string.h> int main() { //向一個檔案中寫入內容 char s[1024] = {0}; //開啟一個檔案 FILE *p = fopen(
NET快取框架CacheManager在混合式開發框架中的應用(1)-CacheManager的介紹和使用 基於C#的MongoDB資料庫開發應用(4)--Redis的安裝及使用
在我們開發的很多分散式專案裡面(如基於WCF服務、Web API服務方式),由於資料提供涉及到資料庫的相關操作,如果客戶端的併發數量超過一定的數量,那麼資料庫的請求處理則以爆發式增長,如果資料庫伺服器無法快速處理這些併發請求,那麼將會增加客戶端的請求時間,嚴重者可能導致資料庫服務或者應用服務直接癱瘓。快取方案
.NET快取框架CacheManager在混合式開發框架中的應用(1)-CacheManager的介紹和使用 基於C#的MongoDB資料庫開發應用(4)--Redis的安裝及使用
在我們開發的很多分散式專案裡面(如基於WCF服務、Web API服務方式),由於資料提供涉及到資料庫的相關操作,如果客戶端的併發數量超過一定的數量,那麼資料庫的請求處理則以爆發式增長,如果資料庫伺服器無法快速處理這些併發請求,那麼將會增加客戶端的請求時間,嚴重者可能導致資料庫服務或者應用服務直接癱瘓。快取方案
nginx 的安裝和gcc gcc-c++配置詳解(新手必看)
首先玩linux的話, gcc gcc-c++,fast-cgi,wget,yum 這些包請確保已經安裝好了, #下載nginx openssl,pcre,zlib wget http://nginx.org/download/nginx-1.12.0.tar.gz&nb
C++中GB2312字串和UTF-8之間的轉換-json中文亂碼問題
在程式設計過程中需要對字串進行不同的轉換,特別是Gb2312和Utf-8直接的轉換。在幾個開源的魔獸私服中,很多都是老外開發的,而暴雪為了能 夠相容世界上的各個字符集也使用了UTF-8。在中國使用VS(VS2005以上版本)開發基本都是使用Gb2312的Unicode字符
C++安裝json庫
ubuntu環境下,安裝jsoncpp庫: 在如下連結,下載jsoncpp-src-5.4.0.tar.gz http://sourceforge.net/projects/jsoncpp/ 在Ubuntu環境下,需先安裝scons: apt-get install scons(要先
json-c 交叉編譯(undefined reference to rpl_malloc )
(如果有幫助,請點個贊;如果有錯誤,請指出;如果轉載,請註明出處) 關鍵詞: (1)json-c (2)mips、openwrt (3)Relocations in generic ELF 正文
c#中的fastjson和Newtonsoft.Json的效能簡單測試
因為我的android中的是fastjson,所有準備在服務端也用fastjson,但可惜的是c#的fastjson不是阿里的 先上程式碼,User是一個類 List<User> users = new List<User&g
C# 關鍵字explicit(顯示),implicit(隱式),類型的隱式和顯式轉換
tar oid bsp color col 必須 code 類型 顯示 class Program { static void Main(string[] args) { Adaptee ada = ne
一起talk C栗子吧(第一百二十三回:C語言實例--顯示變量和函數的地址)
調試 ora 部分 example 多線程 ear red 語言 help 各位看官們,大家好,上一回中咱們說的是多線程的樣例。這一回咱們說的樣例是:顯示變量和函數的地址。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 在編敲代碼時,有時候須