1. 程式人生 > >json-c 的安裝和使用(使用json-c讀取檔案中的json資料和儲存json格式的資料至檔案中)

json-c 的安裝和使用(使用json-c讀取檔案中的json資料和儲存json格式的資料至檔案中)

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壓縮包:

選擇下載(截止到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 ]}[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#的fastjsonNewtonsoft.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栗子吧! 在編敲代碼時,有時候須