




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、JSON簡介JSON(JavaScriptObjectNotation)是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。它基于JavaScriptProgrammingLanguage,StandardJSON采用完全獨立于語言的文本格C,C+,C#,Java,JavaScript,Perl,ECMA-2623rdEdition式,但是也使用了類似于Python等)。這些特性使-December1999的一個子集。C語言家族的習慣(包括JSON成為理想的數(shù)據(jù)交換語言。JSON建構于兩種結(jié)構:對象,即“名稱/值”對的集合(Acollectionofname/valuepa
2、irs)。一個對象可以包含多個“名稱/值”對,可以理解為對象的屬性。數(shù)組,值的有序列表(Anorderedlistofvalues)。其中,“名稱”是一個字符串,而“值”可以是多種數(shù)據(jù)類型,包括:字符串、數(shù)字、布爾值、null值、對象、數(shù)組。由此可見,JSON中數(shù)組和對象之間是可以相互嵌套的。一個JSON文檔被解釋為一個“值”,這個值的類型可以是上面列出的任何類型。這些都是常見的數(shù)據(jù)結(jié)構。事實上大部分現(xiàn)代計算機語言都以某種形式支持它們。這使得一種數(shù)據(jù)格式在同樣基于這些結(jié)構的編程語言之間交換成為可能。JSON具有以下這些形式:對象是一個無序的“名稱/值對”集合。一個對象以“”(左括號)開始,“”
3、(右括號)結(jié)束。每個“名稱”后跟一個“:”(冒號);“名稱/值對”之間使用“,”(逗號)分隔。數(shù)組是值(value)的有序集合。一個數(shù)組以“”(左中括號)開始,“”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。array1-0皿&-o值(valued可以是雙引號括起來的字符串(string)、數(shù)值(number)、true、false、nullD對象(object)或者數(shù)組(array)。這些結(jié)構可以嵌套。value字符串(string)是由雙引號包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個字符(character)即一個單獨的字符串(characterstring)。字符串
4、(string)與C或者Java的字符串非常相似。數(shù)值(numberfl也與C或者Java的數(shù)值非常相似。除去一些編碼細節(jié)。除去未曾使用的八進制與十六進制格式??瞻卓梢约尤氲饺魏畏栔g,但將被解析器過濾掉,不會出現(xiàn)在最終的解析結(jié)果中。Jsoncpp編程接口Jsoncpp是一個使用C+語言實現(xiàn)的面向?qū)ο蟮膉son庫,以靜態(tài)庫的形式提供,使用非常簡單。Jsoncpp提供的接口中有3個核心類:Reader、Writer、Value。Reader類負責從字符串或者輸入流中加載JSON文檔,并進行解析,生成代表JSON文檔的Value對象。Writer類負責將內(nèi)存中的Value對象轉(zhuǎn)換成JSON文檔,
5、輸出到文件或者是字符串中。Wlue類的對象代表一個JSON值,既可以代表一個文檔,也可以代表文檔中一個值。如同JSON中定義的“值”一樣,Value是遞歸的。解析JSON文檔解析一個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、,并不是一個實際實現(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ù)字下標作為索引遍歷所有元素for(intindex=0;indexsize;+index)printValueTree(out,valueindex);break;caseJson:objectValue:/對象類型,其成員被保存在一個map里面,使用name作為索引進行查找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é)構來存儲。比如如下結(jié)構體: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)換為文本進行輸出。所以從內(nèi)存中創(chuàng)建表示的數(shù)據(jù)結(jié)構都需要定義一個JSON時就需要從內(nèi)存中創(chuàng)建一個Value對象也是常用的操作,所有需要轉(zhuǎn)化為BooltoJson(Json:Value&value)Value對象,然后再轉(zhuǎn)化為
10、JSON文檔toJson成員函數(shù):內(nèi)部實現(xiàn)模式如果是一個簡單的Value值,如布爾、數(shù)值、空值、字符串等,則直接使用構造函數(shù)創(chuàng)建Value。如:Value(datatype)如果要創(chuàng)建一個對象類型的Value,首先使用Valueroot(ValueTypetype=objectValue)聲明一個空的類型為對象的Value對象。然后使用類似于roottype”=“USER_INFO的表達式,往root中添加屬性(key/valueiDD如果要創(chuàng)建一個數(shù)組類型的Value,首先使用Valueroot(ValueTypetype=arrayValueD聲明一個空的類型為數(shù)組的ValueDOD然后使
11、用root.append(Value&)成員,在數(shù)組的末尾追加一個值,或者使用rootindex來訪問數(shù)組的元素。如果index值超出了當前數(shù)組的長度,那么將會在數(shù)組末尾追加一個元素,并返回這個元素的引用。要創(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屬性這里隱含自動類型轉(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上半年安徽省蕪湖市三山區(qū)政府招聘4人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省宿州泗縣事業(yè)單位招聘工作人員(第二批)擬聘用人員易考易錯模擬試題(共500題)試卷后附參考答案
- 2024秋季廣東佛山市國星光電股份有限公司秋季校園招聘50人筆試參考題庫附帶答案詳解
- 2024首都文化科技集團有限公司人才招聘10人筆試參考題庫附帶答案詳解
- 2025年上半年安徽民航機場集團限公司專業(yè)技術人員招聘45人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽巢湖管理局漁政管理總站招聘編外使用漁政執(zhí)法船船員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽宿州靈璧投資集團限公司公開招聘工作人員25名易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安慶望江縣國企業(yè)招聘17人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波鄞州區(qū)教育財務管理中心招考易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波慈溪市坎墩街道辦事處編外工作人員招考易考易錯模擬試題(共500題)試卷后附參考答案
- 大數(shù)據(jù)思維與技術知到章節(jié)答案智慧樹2023年北京理工大學
- 天車維修保養(yǎng)記錄表
- ISO9001-2015質(zhì)量管理體系文件全套質(zhì)量手冊、程序文件
- 無損檢測概論(第一)96957課件
- LY/T 1956-2011縣級林地保護利用規(guī)劃編制技術規(guī)程
- 湖南美術出版社五年級下冊書法練習指導
- 《高分子物理》配套教學課件
- 《工程化學》課程教學大綱
- 三年級勞動課1ppt
- 大數(shù)據(jù)在金融領域的應用方案
- 錨桿(索)檢驗批質(zhì)量驗收記錄
評論
0/150
提交評論