首页 > 代码库 > Json入门及基本应用

Json入门及基本应用

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就是一个数据结构。基本上遵循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=http://www.mamicode.com/”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.

好了,我饿了,也写的累了,该去吃晚饭了。写博客的博龄很短,有什么不足之处还请观看的各位海涵。


Json入门及基本应用