Json概念及jsoncpp編程接口說明_第1頁
Json概念及jsoncpp編程接口說明_第2頁
Json概念及jsoncpp編程接口說明_第3頁
Json概念及jsoncpp編程接口說明_第4頁
Json概念及jsoncpp編程接口說明_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JSON簡介JSON(JavaScriptObjectNotation)是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。它基于JavaScriptProgrammingLanguage,StandardJSON采用完全獨(dú)立于語言的文本格C,C+,C#,Java,JavaScript,Perl,ECMA-2623rdEdition式,但是也使用了類似于Python等)。這些特性使-December1999的一個(gè)子集。C語言家族的習(xí)慣(包括JSON成為理想的數(shù)據(jù)交換語言。JSON建構(gòu)于兩種結(jié)構(gòu):對象,即“名稱/值”對的集合(Acollectionofname/valuepa

2、irs)。一個(gè)對象可以包含多個(gè)“名稱/值”對,可以理解為對象的屬性。數(shù)組,值的有序列表(Anorderedlistofvalues)。其中,“名稱”是一個(gè)字符串,而“值”可以是多種數(shù)據(jù)類型,包括:字符串、數(shù)字、布爾值、null值、對象、數(shù)組。由此可見,JSON中數(shù)組和對象之間是可以相互嵌套的。一個(gè)JSON文檔被解釋為一個(gè)“值”,這個(gè)值的類型可以是上面列出的任何類型。這些都是常見的數(shù)據(jù)結(jié)構(gòu)。事實(shí)上大部分現(xiàn)代計(jì)算機(jī)語言都以某種形式支持它們。這使得一種數(shù)據(jù)格式在同樣基于這些結(jié)構(gòu)的編程語言之間交換成為可能。JSON具有以下這些形式:對象是一個(gè)無序的“名稱/值對”集合。一個(gè)對象以“”(左括號)開始,“”

3、(右括號)結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號);“名稱/值對”之間使用“,”(逗號)分隔。數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以“”(左中括號)開始,“”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。array1-0皿&-o值(valued可以是雙引號括起來的字符串(string)、數(shù)值(number)、true、false、nullD對象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。value字符串(string)是由雙引號包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(characterstring)。字符串

4、(string)與C或者Java的字符串非常相似。數(shù)值(numberfl也與C或者Java的數(shù)值非常相似。除去一些編碼細(xì)節(jié)。除去未曾使用的八進(jìn)制與十六進(jìn)制格式??瞻卓梢约尤氲饺魏畏栔g,但將被解析器過濾掉,不會(huì)出現(xiàn)在最終的解析結(jié)果中。Jsoncpp編程接口Jsoncpp是一個(gè)使用C+語言實(shí)現(xiàn)的面向?qū)ο蟮膉son庫,以靜態(tài)庫的形式提供,使用非常簡單。Jsoncpp提供的接口中有3個(gè)核心類:Reader、Writer、Value。Reader類負(fù)責(zé)從字符串或者輸入流中加載JSON文檔,并進(jìn)行解析,生成代表JSON文檔的Value對象。Writer類負(fù)責(zé)將內(nèi)存中的Value對象轉(zhuǎn)換成JSON文檔,

5、輸出到文件或者是字符串中。Wlue類的對象代表一個(gè)JSON值,既可以代表一個(gè)文檔,也可以代表文檔中一個(gè)值。如同JSON中定義的“值”一樣,Value是遞歸的。解析JSON文檔解析一個(gè)JSON文檔的大致過程如下:/生命頂級Value對象Json:Valueroot;/讀取文檔:Std:stringstrdoc=readFromFile(.);/聲明Reader對象Json:Reader_reader;/解析json文檔_reader.paser(strdoc,root);/從root中提取數(shù)據(jù),基本模式如下函數(shù)所示,其中PARAMout只是抽象的占位符,代表用來保存從Value中提取的數(shù)據(jù)的對象

6、,并不是一個(gè)實(shí)際實(shí)現(xiàn)的類。GetValueFromTree(PARAMout,Json:Value&value)switch(value.type()caseJson:nullValue:out.outvalue(null);break;caseJson:intValue:out.outvalue(value.asInt();break;caseJson:uintValue:out.outvalue(value.asUInt();break;caseJson:realValue:out.outvalue(value.asDouble();break;caseJson:stringValue:o

7、ut.outvalue(value.asString().c_str();break;caseJson:booleanValue:break;out.outvalue(value.asBool();break;caseJson:arrayValue:intsize=value.size();/數(shù)組類型,使用數(shù)字下標(biāo)作為索引遍歷所有元素for(intindex=0;indexsize;+index)printValueTree(out,valueindex);break;caseJson:objectValue:/對象類型,其成員被保存在一個(gè)map里面,使用name作為索引進(jìn)行查找Json:Va

8、lue:Membersmembers(value.getMemberNames();/遍歷所有的name,查找值for(Json:Value:Members:iteratorit=members.begin();it!=members.end();+it)conststd:string&name=*it;printValueTree(out,valueindex);break;default:break;不同定義的JSON文檔,保存不同的數(shù)據(jù),解析之后的數(shù)據(jù)也需要使用不同的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)。比如如下結(jié)構(gòu)體:StructuserIntid;Stringname;StructInthomeserve

9、r;Intvistserver;serverinfo;Intskillids3;可使用如下定義的JSON文檔表示:“Type”:“USER_INFO”,“Data”:“id”:1,“name”:“spring”,“server”:“homeserver”:1001,“vistserver”:1003,“skillids”:1,2,3從內(nèi)存中創(chuàng)建ValueDO在需要將內(nèi)存數(shù)據(jù)轉(zhuǎn)換為文本進(jìn)行輸出。所以從內(nèi)存中創(chuàng)建表示的數(shù)據(jù)結(jié)構(gòu)都需要定義一個(gè)JSON時(shí)就需要從內(nèi)存中創(chuàng)建一個(gè)Value對象也是常用的操作,所有需要轉(zhuǎn)化為BooltoJson(Json:Value&value)Value對象,然后再轉(zhuǎn)化為

10、JSON文檔toJson成員函數(shù):內(nèi)部實(shí)現(xiàn)模式如果是一個(gè)簡單的Value值,如布爾、數(shù)值、空值、字符串等,則直接使用構(gòu)造函數(shù)創(chuàng)建Value。如:Value(datatype)如果要?jiǎng)?chuàng)建一個(gè)對象類型的Value,首先使用Valueroot(ValueTypetype=objectValue)聲明一個(gè)空的類型為對象的Value對象。然后使用類似于roottype”=“USER_INFO的表達(dá)式,往root中添加屬性(key/valueiDD如果要?jiǎng)?chuàng)建一個(gè)數(shù)組類型的Value,首先使用Valueroot(ValueTypetype=arrayValueD聲明一個(gè)空的類型為數(shù)組的ValueDOD然后使

11、用root.append(Value&)成員,在數(shù)組的末尾追加一個(gè)值,或者使用rootindex來訪問數(shù)組的元素。如果index值超出了當(dāng)前數(shù)組的長度,那么將會(huì)在數(shù)組末尾追加一個(gè)元素,并返回這個(gè)元素的引用。要?jiǎng)?chuàng)建代表如下JSON000ValueDO:“Type”:“USER_INFO”,“Data”:“id”:1,name”:“spring”,server”:homeserver”:1001,vistserver”:1003,skillids”:1,3,5需要如下代碼:/聲明object類型的對象,根對象string轉(zhuǎn)化為Data子對象ValueValueroot(objectValue);/

12、添加Type屬性這里隱含自動(dòng)類型轉(zhuǎn)換,將Root“Type”=“USER_INFO”;ValueData(objectValue);/下面創(chuàng)建Data“id”=1;Data“name”=“spring”;Value_server(objectValue);_server“homeserver”=1001;_server“vistserver”=1003;Data“server”=_server;Value_skillids(objectValue);_skillids.append(1);_skillids.append(3);_skillids.append(3);Data“skillids”=_skillid

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論