面向对象编程(OOP)里面,大量的用到了对象。那么这里有个基本问题,怎么把这些对象存储到文件或者通过网络传输呢?
我们就得把这个对象转换成某种格式的字符串或者一个字节流。这里涉及两个动作:
1. 把一个对象转换成某种格式的字符串或者字节流;
2. 把一个字符串或者字节流转换成一个对象。
这2个动作有很多种叫法,比如序列化/反序列化,编码/解码,还有什么marshalling/unmarshalling。反正都是这个意思。
有很多方法来实现这个过程,比如常用的XML。我们可以把对象转换成XML格式,然后存储到文件或者在网络上传输。XML是很有效也很常见的一种方法。
用过XML的程序员都知道,XML解析有时很麻烦,什么DOM,SAX,每次解析一种新的XML格式的时候,都得去和那么多的节点打交道。解析XML不难,但是挺烦的,有时就是体力活。我做过一些使用XML的项目,当然XML本身很有效也很灵活,但是每次要解析的时候,就很郁闷,总是搞一些类似的工作。
我们这里就来介绍另外一种数据交换格式:JSON。
JSON, 全称JavaScript Object Notation,可以翻译为JavaScript对象描述。官网:
http://www.json.org/json-zh.html
上面描述的非常详细。
估计这个东西最早是为JavaScript开发的,所以叫做JSON。但是现在JSON已经不仅仅支持JavaScript了,还支持其他语言,比如php,c++,c#, java等等,几乎支持所有主流的语言。具体参考官网。
JSON格式很简单,他就支持2种情况,官网上面是这么描述的:
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
我们可以简单理解为:对象和包含对象的数组。通过这两种结构基本可以覆盖所有的数据抽象。
JavaScript使用JSON
我们先来看看JavaScript对于JSON的应用。要在JavaScript中使用JSON,我们需要一个json.js,这个东西可以在官网上面下载。先给出一个例子代码:
<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
var people = { "name":"Kevin",
"age":30,
"friends":[{"name":"Tom"},
{"name":"Obama"}
]
}
document.write("Javascript<br>");
document.write(people.name);
document.write("<br>");
document.write(people.friends[1].name);
//将对象转换成字符串
document.write("<br>string:<br>");
var str = people.toJSONString();
document.write(str);
//将字符串转换成json对象
var jsonobj = str.parseJSON(str);
document.write("<br>convert to json object: <br>");
for(var i = 0; i < jsonobj.friends.length; i++)
{
document.write(jsonobj.friends[i].name);
document.write("<br>");
}
</script>
例子里面我们首先构造了一个JSON对象people,然后,我们可以把这个对象转换成字符串,运行一下就可以看到people转换成了一个字符串:
{"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
然后我们可以再通过函数parseJSON把这个字符串转换成一个JSON对象,例子里面把转换出来的JSON对象的friend都输出来了。这个例子的输出结果是:
Javascript
Kevin
Obama
string:
{"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
convert to json object:
Tom
Obama
怎么样,很简单吧。跟XML相比是不是方便很多呢?再也不用纠结那么多的节点了。通过一个函数就可以把一个字符串转换成一个JSON对象了。然后就可以对这个对象进行操作了。
PHP使用JSON
这里再举一个PHP的例子,从PHP5.2开始就已经默认支持JSON,所以如果想使用JSON的话,更新PHP到5.2或者5.2以上版本就可以了,相当的easy。
php通过2个函数json_encode和json_decode来实现序列化和反序列化。看下面的例子:
<?
//json.php?jsonstr={"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
echo "<br><br><br><br><br>php json:<br>parameter:'".$_GET['jsonstr']."'<br>";
$jsonobj = json_decode($_GET['jsonstr']);
echo "json object content: <br>";
echo $jsonobj->name."<br>";
echo $jsonobj->age."<br>friends names: <br>";
foreach($jsonobj->friends as $friend )
{
echo $friend->name."<br>";
}
echo "convert json object to string:<br>";
echo json_encode($jsonobj);
?>
这里,我通过url的参数来传递一个JSON格式的字符串,然后php用函数json_decode把这个字符串转换成一个JSON对象,打印信息。再用转换出来的JSON对象通过函数json_encode的到相应的JSON格式的字符串。运行这段代码,可以看到:
php json:
parameter:'{"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}'
json object content:
Kevin
30
friends names:
Tom
Obama
convert json object to string:
{"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
最后一行得到的字符串跟URL参数里面传进去的一模一样。
哈哈,很简单吧。完整代码如下:这里我给这个文件命名成了json.php,只要传个参数就ok了,比如这样访问这个页面:json.php?jsonstr={"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
var people = { "name":"Kevin",
"age":30,
"friends":[{"name":"Tom"},
{"name":"Obama"}
]
}
document.write("Javascript<br>");
document.write(people.name);
document.write("<br>");
document.write(people.friends[1].name);
//将对象转换成字符串
document.write("<br>string:<br>");
var str = people.toJSONString();
document.write(str);
//将字符串转换成json对象
var jsonobj = str.parseJSON(str);
document.write("<br>convert to json object: <br>");
for(var i = 0; i < jsonobj.friends.length; i++)
{
document.write(jsonobj.friends[i].name);
document.write("<br>");
}
</script>
<?
//json.php?jsonstr={"name":"Kevin","age":30,"friends":[{"name":"Tom"},{"name":"Obama"}]}
echo "<br><br><br><br><br>php json:<br>parameter:'".$_GET['jsonstr']."'<br>";
$jsonobj = json_decode($_GET['jsonstr']);
echo "json object content: <br>";
echo $jsonobj->name."<br>";
echo $jsonobj->age."<br>friends names: <br>";
foreach($jsonobj->friends as $friend )
{
echo $friend->name."<br>";
}
echo "convert json object to string:<br>";
echo json_encode($jsonobj);
?>
我们介绍了如何在javascript和php中使用json,javascript和php都是动态语言,对象的绑定很容易。那么像C++这种强类型语言怎么来得到JSON对象呢?我们需要对这个JSON对象进行一些抽象,从而得到一个对应JSON对象的class。幸运的是,已经有很多opensource了,我们直接拿来用就行了。json官网上面已经列了很多C++针对于JSON的opensource了,我们可以直接用。至于怎么用,这里就不再探讨了,总之一句话,也是很容易使用的。
JSON不是针对某种语言的,JSON格式字符串可以在各种语言之间流转,比如C++程序发一个JSON字符串给PHP,PHP可以解析得到一个对象,反之亦然。
好了,介绍完毕。我个人是挺喜欢JSON的,当然JSON并不是其他数据格式的替换。JSON只是多提供了一种选择,我们可以在需要的时候使用它。我们并不能因为JSON而舍弃其他格式,比如XML。