Linux json-c使用
時(shi)間:2018-08-16 來源:未知
一、JSON介紹
JSON(JavaScript Object Notation) 是一種輕量級的(de)(de)數據交換格式。 易(yi)于(yu)(yu)人(ren)閱讀(du)和編寫。同時也易(yi)于(yu)(yu)機器(qi)解析和生(sheng)成(cheng)。 它基于(yu)(yu)JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的(de)(de)一個子(zi)集(ji)。 JSON采用完全(quan)獨立于(yu)(yu)語言的(de)(de)文本格式,但是也使用了類似于(yu)(yu)C語言家族的(de)(de)習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特(te)性(xing)使JSON成(cheng)為理想的(de)(de)數據交換語言。
JSON建(jian)構(gou)于兩種(zhong)結構(gou):
(1) “名稱/值(zhi)”對的集合(A collection of name/value pairs)。不同(tong)的語言(yan)中,它被理解(jie)為(wei)對象(object),紀(ji)錄(record),結構(struct),字典(dictionary),哈希表(hash table),有(you)鍵(jian)列(lie)表(keyed list),或者關聯(lian)數組(zu) (associative array)。
(2)值的有序列表(An ordered list of values)。在大部分語言中,它被(bei)理(li)解為數組(array)。
這(zhe)些都是常見(jian)的數據(ju)結(jie)構。事實上(shang)大(da)部分現代計算機語言都以某種形式(shi)支(zhi)持(chi)它們。這(zhe)使得一(yi)種數據(ju)格式(shi)在同樣(yang)基(ji)于(yu)這(zhe)些結(jie)構的編程(cheng)語言之間(jian)交換成為可能。
JSON具有以(yi)下(xia)這些形式:
對(dui)象(xiang)是一(yi)個(ge)無序的“‘名稱/值’對(dui)”集合。一(yi)個(ge)對(dui)象(xiang)以“{”(左(zuo)括(kuo)(kuo)號)開始,“}”(右(you)括(kuo)(kuo)號)結束。每個(ge)“名稱”后(hou)跟(gen)一(yi)個(ge)“:”(冒號);“‘名稱/值’ 對(dui)”之間使(shi)用“,”(逗號)分隔(ge)。

數組是值(value)的有序(xu)集合。一個數組以“[”(左中(zhong)括號(hao)(hao))開(kai)始,“]”(右中(zhong)括號(hao)(hao))結束。值之(zhi)間使用“,”(逗號(hao)(hao))分隔。

值(value)可以(yi)是雙(shuang)引號(hao)括起來的字(zi)符串(chuan)(string)、數(shu)值(number)、true、false、 null、對象(object)或者數(shu)組(array)。這些結構可以(yi)嵌套。

字(zi)符(fu)串(string)是由(you)雙引號(hao)包圍的(de)任意數量Unicode字(zi)符(fu)的(de)集合(he),使用(yong)反(fan)斜線轉義。一(yi)個字(zi)符(fu)(character)即一(yi)個單獨(du)的(de)字(zi)符(fu)串(character string)。
字符串(string)與C或者Java的字符串非常(chang)相似。

數值(number)也與C或者Java的(de)數值非常相(xiang)似。除去未曾(ceng)使用(yong)的(de)八進(jin)制(zhi)與十六進(jin)制(zhi)格(ge)式。除去一些編碼細節。

空白可以(yi)加入到任何(he)符號之間。以(yi)下描述了完(wan)整的語言(yan)。
二、JSON對象結構
JSON結構共有2種:
(1)對象結構
(2)數組結構
JSON,簡單來說就(jiu)是JavaScript中的對象或(huo)數組,所以(yi)這兩種結構就(jiu)是對象和數組。通(tong)過這兩種結構就(jiu)可(ke)以(yi)表示各種復雜的結構。
1、JSON對象結構
對象結構(gou)是使用(yong)大(da)括(kuo)號(hao)“{}”括(kuo)起來的,大(da)括(kuo)號(hao)內(nei)是由(you)0個(ge)(ge)或多(duo)個(ge)(ge)用(yong)英文逗號(hao)分隔(ge)的“關鍵字:值”對(key:value)構(gou)成的。
語法:
varjsonObj =
{
"鍵名1":值1,
"鍵名2":值2,
……
"鍵名n":值n
}
說明:
jsonObj指的是(shi)json對象。對象結構是(shi)以(yi)“{”開始,到(dao)“}”結束。其中“鍵名(ming)”和“值(zhi)”之(zhi)間(jian)用英文冒(mao)號構成(cheng)對,兩個“鍵名(ming):值(zhi)”之(zhi)間(jian)用英文逗號分隔(ge)。
注意,這里的鍵名是字符串(chuan),但是值可(ke)以是數值、字符串(chuan)、對象、數組或邏輯(ji)true和false。
舉例:
<!DOCTYPE html>
<head>
<script type="text/javascript">
varobj =
{
"name":"helicopter",
"age":23,
//JSON對(dui)(dui)象內部也有一個JSON對(dui)(dui)象
hobby:
{
"first":"swimming",
"second":"singing",
"third":"dancing"
}
}
//讀取JSON數(shu)據
document.write("名字(zi)是:"+obj.name+"<br>");
document.write("第一項(xiang)愛好是:"+obj.hobby.first);
</script>
</head>
</body>
在瀏覽(lan)器預覽(lan)效果(guo)如(ru)下:

2、JSON對象結構
JSON數組結構是用(yong)中括(kuo)號“[]”括(kuo)起來,中括(kuo)號內部由0個或多個以英(ying)文(wen)逗號“,”分(fen)隔的值列(lie)表組成。
語(yu)法(fa):vararr =
[
{
"鍵(jian)名(ming)1":值(zhi)1,
"鍵名2":值2
},
{
"鍵(jian)名3":值3,
"鍵(jian)名4":值(zhi)4
},
……
]
說明:
arr指的是json數(shu)(shu)組。數(shu)(shu)組結(jie)構是以“[”開始(shi),到“]”結(jie)束,這(zhe)一點跟JSON對(dui)象不同。不過在JSON數(shu)(shu)組結(jie)構中,每一對(dui)“{}”相(xiang)當于一個JSON對(dui)象,大家(jia)看(kan)看(kan)像不像?而且語法都非常類似。
注意,這里的鍵名(ming)是字符串,但是值(zhi)可以是數值(zhi)、字符串、對(dui)象(xiang)、數組或邏輯true和false。
舉例:
<!DOCTYPE html>
<head>
<script type="text/javascript">
[
"name":"小(xiao)明",
"gender":"男(nan)"
{
"age":21,
}
//讀取JSON數據
document.write("第(di)二(er)個學生(sheng)的性別是:"+arr[1].gender+"<br>");
</script>
<body>
</html>
在瀏覽(lan)器預覽(lan)效果如下:

三、普通字符串、JSON字符串和JSON對象
初學者(zhe)經常(chang)有一個困惑,就是分(fen)不清(qing)普通字(zi)符(fu)串(chuan)、JSON字(zi)符(fu)串(chuan)和JSON對象。其實這(zhe)3者(zhe)是非常(chang)容易區分(fen)的(de)。
1、普通字符串
字(zi)符(fu)串嘛,大家都知道是使用單引號(hao)(hao)或(huo)雙(shuang)引號(hao)(hao)括起(qi)來(lai)的(de)一(yi)串字(zi)符(fu)。
舉例:
varstr = "綠葉學習網json教程(cheng)";
2、JSON對象
JSON對(dui)象我們在“JSON對(dui)象結構”這一節已經詳細為(wei)大家講(jiang)解了。JSON對(dui)象,指的是符合JSON格(ge)式要求的JavaScript對(dui)象。
舉例:
varjsonObj = {"name":"helicopter","age":23,"gender":"男"};
3、JSON字符串
JSON字符串,指的是符合“JSON格式”的字符串。
JSON字符串要求兩(liang)點(dian):
(1)必須是字符串,也就是要用單引號或雙引號括起來;
(2)必須符合“JSON”格式。
舉例:
varjsonStr = '{"name": "helicopter", "age":23, "gender": "男"}';
JSON字符(fu)串(chuan)說白了就是(shi)在JSON對象外面加(jia)一(yi)對單引號。
大家(jia)好好對(dui)比一下,就知道普通字符串(chuan)、JSON對(dui)象和(he)JSON字符串(chuan)的區別了。
四、Linux JSON庫的安裝
1.下載json-c的源碼
JSON下(xia)載地址(zhi)://github.com/json-c/json-c/wiki
2.解壓json-c的源碼包
tar -xvf json-c-0.10.tar.gz
3.配置json-c的源碼包
(1)在x86平臺配置
./configure --prefix=/usr
(2)在ARM平臺配置
./configure --prefix=安裝路徑 --host=交叉開(kai)發工(gong)具鏈前(qian)綴
例如(ru)安(an)裝路(lu)徑為"/home/linux/json/install" 交叉(cha)開發工具鏈前綴(zhui)為arm-none-linux-gnueabi-,則指定configuer參數如(ru)下:
./configure --prefix=/home/linux/json/install --host=arm-none-linux-gnueabi
4.編譯
make
5.安裝
make install
注意:
在(zai)x86平(ping)臺(tai)安裝(zhuang)的時候(hou),由于(yu)(yu)我們指(zhi)定的/usr目錄,普通用(yong)戶對于(yu)(yu)這個目錄是沒有寫(xie)權限(xian)的,所以在(zai)安裝(zhuang)的時候(hou)會(hui)提示"Permission denied",解決方法是以超級用(yong)戶身(shen)份執行。
五、Linux JSON庫的使用

注意:
在編(bian)譯的時(shi)候(hou),會提示"/usr/include/json/json.h:27:34: fatal error: json_object_iterator.h: No such file or directory",原(yuan)因(yin)是我們在JSON庫安(an)裝的時(shi)候(hou),沒(mei)有將(jiang)json源碼(ma)下(xia)的" json_object_iterator.h"頭文件安(an)裝到(dao)/usr/include/json目錄下(xia),解決的方法很簡單,我們只(zhi)需要將(jiang)json源碼(ma)樹(shu)下(xia)的" json_object_iterator.h"拷貝到(dao)/usr/include/json目錄下(xia)就可(ke)以(yi)了。

