Json入門及基本應用

Json設計的目的

21世紀初,Douglas Crockford尋找一種簡便的數據交換格式,可以在服務器之間交換數據。當時通用的數據交換語言是XML,可是Douglas Crockford以爲XML的生成和解析都太麻煩,因此他提出了一種簡化格式,也就是Json。(做者:參考2)javascript

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)html

四條規則,就是Json格式的全部內容(做者:參考2):java

  • 並列的數據之間用逗號(",")分隔。express

  • 映射用冒號(":")表示。json

  • 並列數據的集合(數組)用方括號("[]")表示。數組

  • 映射的集合(對象)用大括號("{}")表示。服務器

假若有一段 XML:數據結構

<id>1</id>app

<name>張三</name>dom

<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就是一個數據結構。基本上遵循json介紹中提供的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.

好了,我餓了,也寫的累了,該去吃晚飯了。寫博客的博齡很短,有什麼不足之處還請觀看的各位海涵。

相關文章
相關標籤/搜索