分析几种编程语言对JSON的支持程度

概述:
JSON是一种数据存储格式,在AJAX领域,大有替代XML的趋势!尤其是在云计算和OpenSocial背景下,Javascript,Actionscript等客户端编程语言作用更为突出。
本篇文章通过阐述Javascript,Actionscript3的对象机制来了解JSON在客户端编程语言中的实现,并对服务器端编程语言C#,Python,PHP对JSON的支持情况做简单的研究。
目的是让读者能够更加深入的了解动态语言和静态语言的区别,优劣。

--------------------javascript----------------------------------------------------------
首先来了解Javascript的对象机制,JSON的出现离不开Javascript的对象机制。
在javascript中,我们会这样声明一个usr对象:
var usr={'uname':'tooper.gao','sex':'male','age':'26'}
alert(usr.uname);
一个usr集合如何定义呢?
var usrList=[{'uname':'tooper.gao','sex':'male','age':'26'},{'uname':'bruce.lee','sex':'male','age':'23'},{'uname':'jack.chen','sex':'male','age':'27'}]
alert(usrList[0].uname);

而我们知道JSON的数据格式简直就是javascript对象的值部分
单个usr对象:"{'uname':'tooper.gao','sex':'male','age':'26'}"
usr 集合:"[{'uname':'tooper.gao','sex':'male','age':'26'}, {'uname':'bruce.lee','sex':'male','age':'23'},{'uname':'jack.chen','sex':'male','age':'27'}]"

不同的是JSON数据是一个字符串,要把JSON转换为javascript对象,我们需要使用js的eval函数来做简单的处理, 通常就是
var jsObj=eval('('+yourJasonDataString+')')
例如:
var usr=eval("({'uname':'tooper.gao','sex':'male','age':'26'})")
var usrList=eval("([{'uname':'tooper.gao','sex':'male','age':'26'},{'uname':'bruce.lee','sex':'male','age':'23'},{'uname':'jack.chen','sex':'male','age':'27'}])")

---------------------------------actionscript---------------------------
和javascript同属客户端语言,同样是解释型语言,同样应用非常广泛的actionscript,它对JSON的支持情况会是如何呢?研究一下也挺有趣的。
使用actionscript3来声明一个usr对象:
var usr={'uname':'tooper.gao','sex':'male','age':'26'}
trace(usr.uname)
使用actionscript3来定义一个usr对象集合:
var usrList=[{'uname':'tooper.gao','sex':'male','age':'26'},{'uname':'bruce.lee','sex':'male','age':'23'},{'uname':'jack.chen','sex':'male','age':'27'}]
trace(usrList[0].uname);
哈哈,是不是和javascript的声明方式一模一样,这一点也可以理解JSON为什么那么值得推崇了。
把字符串格式的JSON数据转换成一个对象,需要用到第三方提供的库函数,推荐使用as3corelib
var strUsr=” {'uname':'tooper.gao','sex':'male','age':'26'}” //json格式的字符串
var usr=JSON.decode(strUsr) //把字符串转换为对象

---------------------------C#---------------------------------
看到这里就会发现,以javascript为代表的动态语言在对象声明赋值上和静态语言(C#,Java)有很大的差异,前者更为灵活,接下来将以C#为代码用例,来阐述静态语言处理JSON的常规方式。
在C#语言中,我们通常要先定义一个这样的类,然后再对该类进行实例化,赋值。如果是一个对象的集合,还要用到List<myObj>。

定义一个UsrInfo对象:
using System;
namespace YourNamespace
{
    public class UsrInfo
    {
        private string _uname = string.Empty;
        private string _sex = string.Empty;
        private string _age = string.Empty;
        public string Uname
        {
            get { return _uname; }
            set { _uname = value; }
        }
        public string Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }
        public string Age
        {
            get { return _age; }
            set { _age = value; }
        }
    }
}

实例化并赋值:
UsrInfo item = new UsrInfo();
item.Uname = "tooper.gao";
item.Sex = "male";
item.Age = "26";

Usr集合:
List<UsrInfo> list=new List<UsrInfo>();
UsrInfo item = new UsrInfo();
item.Uname = "tooper.gao";
item.Sex = "male";
item.Age = "26";
list.Add(item);

在AJAX应用中,通常要把服务器端的对象,或者是对象集合转换成JSON格式的文本输出给客户端,如何把C#对象转换为JSON字符串?
你可以在类里面定义一个ToJSON()方法,把对象属性和值按照JSON的标准拼合成字符串。也可以通过现有的一些C#的JSON Lib库函数进行转换,
推荐使用litjson(http://litjson.sourceforge.net/),其思路是提供object2json,json2object的函数库,在转换时调用,而不是在每个实体类中定义这样的方法。
具体的代码可以参考其官网提供的样例,再此不多做阐述。

通过上面C#的类声明,实例化并赋值的,还要用到第三方的Lib来完成obj2json的转换。哦,是不是觉的这样的过程太漫长,代码太多?
会不会想,如果服务器端的编程语言和客户端编程语言的语法相似,就不用类、对象、转换这样的工作了?
事实上,和javascript这样语法相似的有很多,而且他们都归属一个很酷的语言种族:动态语言。动态语言有静态语言所无可比拟的灵活性,因此可以有效解决代码量超多,开发工作效率低的问题。
接下来,会拿Pyhon来说明动态语言如何快捷、高效的实现JSON支持!
----------------------------------Python-------------

不知道是python抄袭javascript的风格,还是说javascript抄袭python的,又或者说英雄所见略同!
python的字典(Dictinary)为python的内置数据类型,它的语法和javascript声明对象方式一样,使用Python创建一usr:
usr={'uname':'tooper.gao','sex':'male','age':'26'}

另外,python有一个内置的数据类型List,相当于javascript的数组,使用Python创建一usr集合:
usrList=[{'uname':'tooper.gao','sex':'male','age':'26'},{'uname':'bruce.lee','sex':'male','age':'23'},{'uname':'jack.chen','sex':'male','age':'27'}]
想想看,这样的服务器端对象和客户端对象还有区别吗?还需要用什么库函数进行obj2json的转换吗?当然不需要了!

---------------------------------PHP----------------
接下来说一说PHP,PHP也是一门动态语言,PHP5加入了更多的面向对象编程的语法。
使用PHP创建一usr对象:
$usr=array("uname"=>"tooper.gao","sex"=>"male","age"=>"26")

使用PHP创建一usrList usr集合:
$usrList=array($usr,$usr1,$usr2,$usr3)

如何把这样的数组转换为JSON,(注意:PHP也是需要这么一个转换操作的)
serialize($usr)
输出:a:3:{s:5:"uname";s:10:"tooper.gao";s:3:"sex";s:4:"male";s:3:"age";s:2:"26";}
由此可见,PHP的serialize函数并不是转为JSON而设计的,那么也是需要其他的函数来转换的。

总结:
作为客户端编程的两大语言,javascript,actionscript,在支持JSON方面,那是天造地设的。
而通过对服务器端编程语言C#,Python,PHP的比较,在支持JSON方面,您有和感想?
C#的实现最冗余,PHP的语法怪怪的,总觉得不爽,而Python呢,同样也是天生的。

从这个角度考虑,google推广他的云计算,他的opensocial,大力应用宣传js,不难想想,它为什么会选择python作为他的第三大开发语言了!
而作为我们公司为客户端提供调用服务,是不是也要考虑一下把JSON作为标配的数据格式呢?

在这篇文章中,服务器端编程,我仅仅介绍了obj2json,也即是序列化的过程,而没有介绍饭序列化的过程,大家可以借题发挥一下,呵呵。
关于Python,我对他的赞美还有很多,在这里就不多说什么了。
接下来有时间我会整理出各种语言在实现FIFO,FILO,设计模式中的单例,抽象工厂,builder模式,观察者模式等的优劣,

参考链接:
1、http://www.json.org
2、http://www.python.org
3、litjson(http://litjson.sourceforge.net/)
4、http://www.souout.com/group.aspx?id=21


posted @ 2008-10-31 16:00  高天蒲  阅读(2303)  评论(1编辑  收藏  举报
[url=http://t.sina.com.cn/1084588625?s=6uyXnP][img]http://service.t.sina.com.cn/widget/qmd/1084588625/a57ab42b/1.png[/img][/url]