首页 > 代码库 > 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入门及基本应用