當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Linux json-c使用
一、JSON介紹
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。 它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集。 JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語言。
JSON建構(gòu)于兩種結(jié)構(gòu):
(1) “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀(jì)錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組 (associative array)。
(2)值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數(shù)組(array)。
這些都是常見的數(shù)據(jù)結(jié)構(gòu)。事實(shí)上大部分現(xiàn)代計(jì)算機(jī)語言都以某種形式支持它們。這使得一種數(shù)據(jù)格式在同樣基于這些結(jié)構(gòu)的編程語言之間交換成為可能。
JSON具有以下這些形式:
對象是一個(gè)無序的“‘名稱/值’對”集合。一個(gè)對象以“{”(左括號)開始,“}”(右括號)結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以“[”(左中括號)開始,“]”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。
值(value)可以是雙引號括起來的字符串(string)、數(shù)值(number)、true、false、 null、對象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。
字符串(string)是由雙引號包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(character string)。
字符串(string)與C或者Java的字符串非常相似。
數(shù)值(number)也與C或者Java的數(shù)值非常相似。除去未曾使用的八進(jìn)制與十六進(jìn)制格式。除去一些編碼細(xì)節(jié)。
空白可以加入到任何符號之間。以下描述了完整的語言。
二、JSON對象結(jié)構(gòu)
JSON結(jié)構(gòu)共有2種:
(1)對象結(jié)構(gòu)
(2)數(shù)組結(jié)構(gòu)
JSON,簡單來說就是JavaScript中的對象或數(shù)組,所以這兩種結(jié)構(gòu)就是對象和數(shù)組。通過這兩種結(jié)構(gòu)就可以表示各種復(fù)雜的結(jié)構(gòu)。
1、JSON對象結(jié)構(gòu)
對象結(jié)構(gòu)是使用大括號“{}”括起來的,大括號內(nèi)是由0個(gè)或多個(gè)用英文逗號分隔的“關(guān)鍵字:值”對(key:value)構(gòu)成的。
語法:
varjsonObj =
{
"鍵名1":值1,
"鍵名2":值2,
……
"鍵名n":值n
}
說明:
jsonObj指的是json對象。對象結(jié)構(gòu)是以“{”開始,到“}”結(jié)束。其中“鍵名”和“值”之間用英文冒號構(gòu)成對,兩個(gè)“鍵名:值”之間用英文逗號分隔。
注意,這里的鍵名是字符串,但是值可以是數(shù)值、字符串、對象、數(shù)組或邏輯true和false。
舉例:
<!DOCTYPE html>
<head>
<script type="text/javascript">
varobj =
{
"name":"helicopter",
"age":23,
//JSON對象內(nèi)部也有一個(gè)JSON對象
hobby:
{
"first":"swimming",
"second":"singing",
"third":"dancing"
}
}
//讀取JSON數(shù)據(jù)
document.write("名字是:"+obj.name+"<br>");
document.write("第一項(xiàng)愛好是:"+obj.hobby.first);
</script>
</head>
</body>
在瀏覽器預(yù)覽效果如下:
2、JSON對象結(jié)構(gòu)
JSON數(shù)組結(jié)構(gòu)是用中括號“[]”括起來,中括號內(nèi)部由0個(gè)或多個(gè)以英文逗號“,”分隔的值列表組成。
語法:vararr =
[
{
"鍵名1":值1,
"鍵名2":值2
},
{
"鍵名3":值3,
"鍵名4":值4
},
……
]
說明:
arr指的是json數(shù)組。數(shù)組結(jié)構(gòu)是以“[”開始,到“]”結(jié)束,這一點(diǎn)跟JSON對象不同。不過在JSON數(shù)組結(jié)構(gòu)中,每一對“{}”相當(dāng)于一個(gè)JSON對象,大家看看像不像?而且語法都非常類似。
注意,這里的鍵名是字符串,但是值可以是數(shù)值、字符串、對象、數(shù)組或邏輯true和false。
舉例:
<!DOCTYPE html>
<head>
<script type="text/javascript">
[
"name":"小明",
"gender":"男"
{
"age":21,
}
//讀取JSON數(shù)據(jù)
document.write("第二個(gè)學(xué)生的性別是:"+arr[1].gender+"<br>");
</script>
<body>
</html>
在瀏覽器預(yù)覽效果如下:
三、普通字符串、JSON字符串和JSON對象
初學(xué)者經(jīng)常有一個(gè)困惑,就是分不清普通字符串、JSON字符串和JSON對象。其實(shí)這3者是非常容易區(qū)分的。
1、普通字符串
字符串嘛,大家都知道是使用單引號或雙引號括起來的一串字符。
舉例:
varstr = "綠葉學(xué)習(xí)網(wǎng)json教程";
2、JSON對象
JSON對象我們在“JSON對象結(jié)構(gòu)”這一節(jié)已經(jīng)詳細(xì)為大家講解了。JSON對象,指的是符合JSON格式要求的JavaScript對象。
舉例:
varjsonObj = {"name":"helicopter","age":23,"gender":"男"};
3、JSON字符串
JSON字符串,指的是符合“JSON格式”的字符串。
JSON字符串要求兩點(diǎn):
(1)必須是字符串,也就是要用單引號或雙引號括起來;
(2)必須符合“JSON”格式。
舉例:
varjsonStr = '{"name": "helicopter", "age":23, "gender": "男"}';
JSON字符串說白了就是在JSON對象外面加一對單引號。
大家好好對比一下,就知道普通字符串、JSON對象和JSON字符串的區(qū)別了。
四、Linux JSON庫的安裝
1.下載json-c的源碼
JSON下載地址:https://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=交叉開發(fā)工具鏈前綴
例如安裝路徑為"/home/linux/json/install" 交叉開發(fā)工具鏈前綴為arm-none-linux-gnueabi-,則指定configuer參數(shù)如下:
./configure --prefix=/home/linux/json/install --host=arm-none-linux-gnueabi
4.編譯
make
5.安裝
make install
注意:
在x86平臺安裝的時(shí)候,由于我們指定的/usr目錄,普通用戶對于這個(gè)目錄是沒有寫權(quán)限的,所以在安裝的時(shí)候會提示"Permission denied",解決方法是以超級用戶身份執(zhí)行。
五、Linux JSON庫的使用
注意:
在編譯的時(shí)候,會提示"/usr/include/json/json.h:27:34: fatal error: json_object_iterator.h: No such file or directory",原因是我們在JSON庫安裝的時(shí)候,沒有將json源碼下的" json_object_iterator.h"頭文件安裝到/usr/include/json目錄下,解決的方法很簡單,我們只需要將json源碼樹下的" json_object_iterator.h"拷貝到/usr/include/json目錄下就可以了。