zoukankan      html  css  js  c++  java
  • 分析几种编程语言对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


  • 相关阅读:
    如何经营爱情!
    document.getElementById('myframe')和window.frames[i]的区别
    [WPF] 使用 MVVM Toolkit 构建 MVVM 程序
    [WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
    centos 7执行yum update时在clean up阶段挂住
    实现线性结构转树形结构(生成无限层级菜单)
    中文分词——HMM算法
    中文分词——最大匹配法
    爱因斯坦求和约定
    jupyter notebook美化
  • 原文地址:https://www.cnblogs.com/gaotianpu/p/1323770.html
Copyright © 2011-2022 走看看