Json入门及基本应用
2019獨角獸企業重金招聘Python工程師標準>>>
Json設計的目的
21世紀初,Douglas Crockford尋找一種簡便的數據交換格式,能夠在服務器之間交換數據。當時通用的數據交換語言是XML,但是Douglas Crockford覺得XML的生成和解析都太麻煩,所以他提出了一種簡化格式,也就是Json。(作者:參考2)
Json介紹
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易于人閱讀和編寫。同時也易于機器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 (作者:參考1)
四條規則,就是Json格式的所有內容(作者:參考2):
并列的數據之間用逗號(",")分隔。
映射用冒號(":")表示。
并列數據的集合(數組)用方括號("[]")表示。
映射的集合(對象)用大括號("{}")表示。
假如有一段 XML:
<id>1</id>
<name>張三</name>
<age>25</age>
用 json 可以表示為:
{"id":1,"name":"張三","age":25}
Json應用
javascript
由于json是基于javascript的一個子集,所以在javascript下使用json就要相對容易些。接下來,我們看些例子:
1?var?myFirstJSON?=?{?"firstName"?:?"John",2?????????????????????"lastName"??:?"Doe",3?????????????????????"age"???????:?23?};4?5?document.writeln(myFirstJSON.firstName);??//?Outputs?John6?document.writeln(myFirstJSON.lastName);???//?Outputs?Doe7?document.writeln(myFirstJSON.age);????????//?Outputs?23我們創建了一個名為myFirstJSON對象里面有三個屬性firstName,lastName,age。接下來調用myFirstJSON對象的三個屬性來打印出value值,是不是很簡單?
當然有些人就會質疑說,這個不就是javascript中的對象和屬性嘛,哪來什么json,其實json就是一個數據結構?;旧献裱璲son介紹中提供的4條原則那么它就是一個json格式。
好了我們再來說說原生json格式解析的例子(作者:參考3):
?1?//?The?following?block?implements?the?string.parseJSON?method?2?(function?(s)?{?3???//?This?prototype?has?been?released?into?the?Public?Domain,?2007-03-20?4???//?Original?Authorship:?Douglas?Crockford?5???//?Originating?Website:?http://www.JSON.org?6???//?Originating?URL????:?http://www.JSON.org/JSON.js?7??8???//?Augment?String.prototype.?We?do?this?in?an?immediate?anonymous?function?to?9???//?avoid?defining?global?variables.10?11???//?m?is?a?table?of?character?substitutions.12?13???var?m?=?{14?????'\b':?'\\b',15?????'\t':?'\\t',16?????'\n':?'\\n',17?????'\f':?'\\f',18?????'\r':?'\\r',19?????'"'?:?'\\"',20?????'\\':?'\\\\'21???};22?23???s.parseJSON?=?function?(filter)?{24?25?????//?Parsing?happens?in?three?stages.?In?the?first?stage,?we?run?the?text?against26?????//?a?regular?expression?which?looks?for?non-JSON?characters.?We?are?especially27?????//?concerned?with?'()'?and?'new'?because?they?can?cause?invocation,?and?'='28?????//?because?it?can?cause?mutation.?But?just?to?be?safe,?we?will?reject?all29?????//?unexpected?characters.30?31?????try?{32???????if?(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u?\n\r\t])+?$/.33?????????test(this))?{34?35???????????//?In?the?second?stage?we?use?the?eval?function?to?compile?the?text?into?a36???????????//?JavaScript?structure.?The?'{'?operator?is?subject?to?a?syntactic?ambiguity37???????????//?in?JavaScript:?it?can?begin?a?block?or?an?object?literal.?We?wrap?the?text38???????????//?in?parens?to?eliminate?the?ambiguity.39?40???????????var?j?=?eval('('?+?this?+?')');41?42???????????//?In?the?optional?third?stage,?we?recursively?walk?the?new?structure,?passing43???????????//?each?name/value?pair?to?a?filter?function?for?possible?transformation.44?45???????????if?(typeof?filter?===?'function')?{46?47?????????????function?walk(k,?v)?{48???????????????if?(v?&&?typeof?v?===?'object')?{49?????????????????for?(var?i?in?v)?{50???????????????????if?(v.hasOwnProperty(i))?{51?????????????????????v[i]?=?walk(i,?v[i]);52???????????????????}53?????????????????}54???????????????}55???????????????return?filter(k,?v);56?????????????}57?58?????????????j?=?walk('',?j);59???????????}60???????????return?j;61?????????}62???????}?catch?(e)?{63?64???????//?Fall?through?if?the?regexp?test?fails.65?66???????}67???????throw?new?SyntaxError("parseJSON");68?????};69???}70?)?(String.prototype);71?//?End?public?domain?parseJSON?block72?73?//?begin?sample?code?(still?public?domain?tho)74?JSONData?=?'{"color"?:?"green"}';???//?Example?of?what?is?received?from?the?server.75?testObject=JSONData.parseJSON();??? 76?document.writeln(testObject.color);?//?Outputs:?Green.在上面這段代碼中我們在String原型中添加了一個parseJSON()方法,有一個filter過濾函數,但是是可選項。
友情提示給初學者:
1?(function(s){? 2?????s.parseJSON??=?function(){3????????alert(this+'----parseJSON');4?????};5?})(String.prototype);6?var?a='abc';7?a.parseJSON();這段代碼意思是添加了一個自執行的函數,把String對象的原型傳遞給了形參s,并在String原型中添加parseJSON方法,打印出來 this+’----pareseJSON’ 其中this是調用這個parseJSON()方法的String字符串。
作者對于javascript對json格式的序列化和反序列化用的比較多的是json-sans-eval。請看參考4(無語執行eval的json解析)
提供一段google-code里的示例代碼:
1?var?myJson?=?'{?"x":?"Hello,?World!",?"y":?[1,?2,?3]?}';2?var?myJsonObj?=?jsonParse(myJson);3?alert(myJsonObj.x);??//?alerts?Hello,?World!4?for?(var?k?in?myJsonObj)?{5???//?alerts?x=Hello,?World!??and??y=1,2,36???alert(k?+?'='?+?myJsonObj[k]);7?}使用非常簡單,你只需要把json-sans-eval下載下來后在html里引進<script src=”yourpath/json-minified.js”></script>
然后接下來就可以使用jsonParse(jsonString)方法來解析json格式了。需要了解源碼和詳細用法的都可以去訪問參考4里的網站。
java
在java中序列化和反序列化json格式的jar包還是比較多的。比如:json-lib,jackson,fastjson,json-tools等等。
以前用到的比較多的是json-lib,但是其解析性能不如jackson。其中就有一網友做了測試,不過非正式的測試,僅供參考。請訪問參考5網站。
對于json-lib的解析(參考了網上一段代碼):
?1?import?java.util.ArrayList;?2?import?java.util.HashMap;?3?import?java.util.List;?4?import?java.util.Map;?5??6?import?net.sf.json.JSONArray;?7?import?net.sf.json.JSONObject;?8??9?public?class?JSONTest?{10?????public?static?void?main(String[]?args)?{??? 11?????????JSONTest?j?=?new?JSONTest();??? 12?????????j.ObjectList2json();??? 13?????}???? 14????15?????public?void?ObjectList2json(){16?????????Map?map?=?new?HashMap();17?????????18?????????List?jlist?=?new?ArrayList();19?????????JSONTestBean?bean1?=?new?JSONTestBean("zhangbo","123123");20?????????JSONTestBean?bean2?=?new?JSONTestBean("lisi","65489");21?????????Props?props?=?new?Props("127.0.0.1","8008");22?????????23?????????jlist.add(bean1);24?????????jlist.add(bean2);25?????????26?????????map.put("Props",?props);27?????????map.put("jsonObjectList",?jlist);28?????????29?????????JSONArray?jsonArray?=?JSONArray.fromObject(map);??? 30?????????System.out.println(jsonArray);??? 31?????}32?????33?????public?void?arr2json()?{??? 34?????????boolean[]?boolArray?=?new?boolean[]?{?true,?false,?true?};??? 35?????????JSONArray?jsonArray?=?JSONArray.fromObject(boolArray);??? 36?????????System.out.println(jsonArray);??? 37?????????//?prints?[true,false,true]???38?????}??? 39????40?????public?void?list2json()?{??? 41?????????List?list?=?new?ArrayList();?? 42?????????list.add("first");??? 43?????????list.add("second");??? 44?????????JSONArray?jsonArray?=?JSONArray.fromObject(list);??? 45?????????System.out.println(jsonArray);??? 46?????????//?prints?["first","second"]???47?????}??? 48????49?????public?void?createJson()?{??? 50?????????JSONArray?jsonArray?=?JSONArray.fromObject("['json','is','easy']");??? 51?????????System.out.println(jsonArray);??? 52?????????//?prints?["json","is","easy"]???53?????}??? 54????55?????public?void?map2json()?{??? 56?????????Map?map?=?new?HashMap();57?????????map.put("name",?"json");??? 58?????????map.put("bool",?Boolean.TRUE);??? 59?????????map.put("int",?new?Integer(1));??? 60?????????map.put("arr",?new?String[]?{?"a",?"b"?});??? 61?????????map.put("func",?"function(i){?return?this.arr[i];?}");??? 62????63?????????JSONObject?json?=?JSONObject.fromObject(map);??? 64?????????System.out.println(json);??? 65?????????//?prints??? 66?????????//?["name":"json","bool":true,"int":1,"arr":["a","b"],"func":function(i){??? 67?????????//?return?this.arr[i];?}]???68?????}??? 69????70?????public?void?bean2json()?{??? 71?????????JSONObject?jsonObject?=?JSONObject.fromObject(new?JSONTestBean("zhangbo","234234"));??? 72?????????System.out.println(jsonObject);??? 73?????????/*??74??????????*?prints??? 75??????????*?{"func1":function(i){?return?this.options[i];?? 76??????????*?},"pojoId":1,"name":"json","func2":function(i){?return?? 77??????????*?this.options[i];?}}?? 78??????????*/???79?????}??? 80????81?????public?void?json2bean()?{??? 82?????????String?json?=?"{name=/"json2/",func1:true,pojoId:1,func2:function(a){?return?a;?},options:['1','2']}";??? 83?//????????JSONObject?jb?=?JSONObject.fromString(json);??? 84?//????????JSONObject.toBean(jb,?MyBean.class);???85?????????System.out.println();??? 86?????}??? 87?}javabean:
?1?public?class?JSONTestBean?{?2??3?????private?String?userName;?4??5?????private?String?password;?6??7?????public?JSONTestBean()?{?8??9?????}10?11?????public?JSONTestBean(String?username,?String?password)?{12?????????this.userName?=?username;13?????????this.password?=?password;14?????}15?16?????public?String?getPassword()?{17?????????return?password;18?????}19?20?????public?void?setPassword(String?password)?{21?????????this.password?=?password;22?????}23?24?????public?String?getUserName()?{25?????????return?userName;26?????}27?28?????public?void?setUserName(String?userName)?{29?????????this.userName?=?userName;30?????}31?}32?33?//===================================================34?public?class?Props?{35?????private?String?ip;36?????private?String?port;37?38?????public?Props()?{39?????}40?41?????public?Props(String?ip,?String?port)?{42?????????this.ip?=?ip;43?????????this.port?=?port;44?????}45?46?????public?String?getIp()?{47?????????return?ip;48?????}49?50?????public?void?setIp(String?ip)?{51?????????this.ip?=?ip;52?????}53?54?????public?String?getPort()?{55?????????return?port;56?????}57?58?????public?void?setPort(String?port)?{59?????????this.port?=?port;60?????}61?62?}對于jackson的解析(參考了網上一段代碼):
?1?/**?2??*?使用Jackson生成json格式字符串?3??*?4??*?@author?archie2010?since?2011-4-26下午05:59:46?5??*/?6?public?class?JacksonTest?{?7??8?????private?static?JsonGenerator?jsonGenerator?=?null;?9?????private?static?ObjectMapper?objectMapper?=?null;10?????private?static?User?user?=?null;11?12?????/**13??????*?轉化實體為json字符串14??????*?@throws?IOException15??????*/16?????public?static?void?writeEntity2Json()?throws?IOException{17?????????System.out.println("使用JsonGenerator轉化實體為json串-------------");18?????????//writeObject可以轉換java對象,eg:JavaBean/Map/List/Array等19?????????jsonGenerator.writeObject(user);20?????????System.out.println();21?????????System.out.println("使用ObjectMapper-----------");22?????????//writeValue具有和writeObject相同的功能23?????????objectMapper.writeValue(System.out,?user);24?????}25?????/**26??????*?轉化Map為json字符串27??????*?@throws?JsonGenerationException28??????*?@throws?JsonMappingException29??????*?@throws?IOException30??????*/31?????public?static?void?writeMap2Json()?throws?JsonGenerationException,?JsonMappingException,?IOException{32?????????System.out.println("轉化Map為字符串--------");33?????????Map<String,?Object>?map=new?HashMap<String,?Object>();34?????????map.put("uname",?user.getUname());35?????????map.put("upwd",?user.getUpwd());36?????????map.put("USER",?user);37?????????objectMapper.writeValue(System.out,?map);38?????}39?????/**40??????*?轉化List為json字符串41??????*?@throws?IOException? 42??????*?@throws?JsonMappingException? 43??????*?@throws?JsonGenerationException? 44??????*/45?????public?static?void?writeList2Json()?throws?IOException{46?????????List<User>?userList=new?ArrayList<User>();47?????????userList.add(user);48?????????49?????????User?u=new?User();50?????????u.setUid(10);51?????????u.setUname("archie");52?????????u.setUpwd("123");53?????????userList.add(u);54?????????objectMapper.writeValue(System.out,?userList);55?????????56??????????57?????????58?????????objectMapper.writeValue(System.out,?userList);59?????}60?????public?static?void?main(String[]?args)?{61?????????user?=?new?User();62?????????user.setUid(5);63?????????user.setUname("tom");64?????????user.setUpwd("123");65?????????user.setNumber(3.44);66?????????objectMapper?=?new?ObjectMapper();67?????????try?{68?????????????jsonGenerator?=?objectMapper.getJsonFactory().createJsonGenerator(System.out,?JsonEncoding.UTF8);69?????????????//writeEntity2Json();70?????????????//writeMap2Json();71?????????????writeList2Json();72?????????}?catch?(IOException?e)?{73?74?????????????e.printStackTrace();75?76?????????}77?????}78?}輸出結果:
[{"number":3.44,"uname":"tom","upwd":"123","uid":5},{"number":0.0,"uname":"archie","upwd":"123","uid":10}]
還有fastjson的解析,這里就給個鏈接(http://www.oschina.net/code/snippet_12_3494),就不再羅嗦了。
delphi
這個慢慢被計算機潮流退出舞臺的語言。由于最近公司需要,還有寫些delphi代碼,delphi對于json支持也不是非常的友好。不過還是給點參考代碼:
用了json首頁中推薦的JSON delphi Library
?1?var??2???js,xs:TlkJSONobject;?3???ws:?TlkJSONstring;?4???s:?String;?5???i:?Integer;?6???b:?TStringStream;?7?begin??8???b?:=?TStringStream.Create();?9???b.LoadFromFile('a.txt');? 10???s?:=?b.DataString;? 11?12???js?:=?TlkJSON.ParseText(s)?as?TlkJSONobject;? 13???Memo1.Lines.Add('parent?self-type?name:?'?+?js.SelfTypeName);? 14???Memo1.Lines.Add(IntToStr(TlkJSONlist(js.Field['metaData'].Field['fields']).count));? 15???Memo1.Lines.Add(TlkJSONlist(js.Field['metaData'].Field['fields']).Child[1].field['name'].Value);隨便提一下YAML格式 官網是:http://yaml.org/
簡單的一個YAML格式:
?1?---?!clarkevans.com/^invoice?2?invoice:?34843?3?date???:?2001-01-23?4?bill-to:?&id001?5?????given??:?Chris?6?????family?:?Dumars?7?????address:?8?????????lines:?|?9?????????????458?Walkman?Dr.10?????????????Suite?#29211?????????city????:?Royal?Oak12?????????state???:?MI13?????????postal??:?4804614?ship-to:?*id00115?product:16?????-?sku?????????:?BL394D17???????quantity????:?418???????description?:?Basketball19???????price???????:?450.0020?????-?sku?????????:?BL4438H21???????quantity????:?122???????description?:?Super?Hoop23???????price???????:?2392.0024?tax??:?251.4225?total:?4443.5226?comments:?>27?????Late?afternoon?is?best.28?????Backup?contact?is?Nancy29?????Billsmer?@?338-4338.好了,我餓了,也寫的累了,該去吃晚飯了。寫博客的博齡很短,有什么不足之處還請觀看的各位海涵。
轉載于:https://my.oschina.net/u/566587/blog/322989
總結
以上是生活随笔為你收集整理的Json入门及基本应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libjpeg的问题
- 下一篇: 理解class.forName()(go