文章目录
作为一个web开发的小白鼠,对于一些入门级的知识,还是一头雾水,比如说我们很常见JSON与JSON字符串,在开发的过程中,傻傻分不清。今天看了一篇阮师兄的博客,感觉很有收益,在这里写下一些心得。
在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式。
道格拉斯同学长期担任雅虎的高级架构师,自然钟情于JavaScript。他设计的JSON实际上是JavaScript的一个子集。在JSON中,一共就这么几种数据类型:
number:和JavaScript的number完全一致;
boolean:就是JavaScript的true或false;
string:就是JavaScript的string;
null:就是JavaScript的null;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的{ … }表示方式。
以及上面的任意组合。
并且,JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的string规定必须用双引号"",Object的键也必须用双引号""。
把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。就像我们在日常的开发中,经常会将json字符串放在body里。
如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。
比如说在rails中,我们会用json库中to_json方法将json object序列化成json字符串:
test = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: nil,
middle-school: '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
}
我们可以看到,这个hash的对象中对某个key中双引号做了转义,假如说我们使用to_json方法,就还会增加一层转义:
"{\"name\":\"小明\",\"age\":14,\"gender\":true,\"height\":1.65,\"grade\":null,\"middle-school\":\"\\\\\\\"W3C\\\\\\\" Middle School\",\"skills\":[\"JavaScript\",\"Java\",\"Python\",\"Lisp\"]}"
然后使用JSON.parse解析,我们就可以得到预想中对json 对象了:
test = "{\"name\":\"小明\",\"age\":14,\"gender\":true,\"height\":1.65,\"grade\":null,\"middle-school\":\"\\\\\\\"W3C\\\\\\\" Middle School\",\"skills\":[\"JavaScript\",\"Java\",\"Python\",\"Lisp\"]}"
JSON.parse(test)
{"name"=>"小明",
"age"=>14,
"gender"=>true,
"height"=>1.65,
"grade"=>nil,
"middle-school"=>"\\\"W3C\\\" Middle School",
"skills"=>["JavaScript", "Java", "Python", "Lisp"]}