JSON快速入门

来源:互联网 发布:deepin linux安装教程 编辑:程序博客网 时间:2024/06/05 14:17
一、json是什么?
JavaScript Object Notation 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

 二、xml与json比较:
xml:
    优点:
    (1).xml是一种通用的数据格式
    (2).不必把数据强加到已经定义好的格式中,而是要为数据自定义合适的标记
    (3).可以利用dom完全掌控文档
    缺点:
    (1).如果文档来自服务器,就必须保证文档含有正确的首部信息。若文档类型不正确,那么responseXML的值将为空。
    (2).当浏览器接收到长的xml文件后,dom解析可能会很复杂。
    (3)服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
json:
       优点:

(1)数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

(2)易于解析,客户端JavaScript可以简单的通过eval_r()进行JSON数据的读取;

(3)支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

(4)在PHP世界,已经有PHP-JSONJSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

(5)因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

缺点:

(1)没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

(2)JSON格式目前在Web Service中推广还属于初级阶段

比较:

(1)在可读性方面,JSONXML的数据可读性基本相同。JSONXML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

(2)在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3)在编码难度方面,XML有丰富的编码工具,比如Dom4jJDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

(4)在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5)在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6) JSONXML同样拥有丰富的解析手段。

(7)JSON相对于XML来讲,数据的体积小。

(8)JSONJavaScript的交互更加方便。

(9)JSON对数据的描述性比XML较差。

(10)JSON的速度要远远快于XML

注:数据交换格式的轻量级和重量级的比较:

轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体现在哪呢?我想应该体现在解析上,XML目前设计了两种解析方式:DOM和 SAX;

  DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;

  SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。

  所以,JSON和XML的轻/重量级的区别在于:JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;而XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

三、一个简单的json示例:
var rich = {                "name":"sjj",                "age":"23",                "address":                    [                        {"province":"anhui","city":"anqing"},                        {"province":"beijing","city":"haidian"}                    ],                "wife":                    {                        "name":"gl",                        "age":"20",                        "husband":"sjj"                    }            };            //js能够识别出json数据格式:            alert(rich.name);                        alert(rich.address[0].province);            alert(rich.address[0].city);            alert(rich.address[1].province);            alert(rich.address[1].city);                        alert(rich.wife.name);            alert(rich.wife.age);            alert(rich.wife.husband);
四.json的书写格式
json语法很简单,也很容易理解,具体如下:
语法规则:
  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
JSON 值:
  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

JSON 名称/值对

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

"firstName" : "John"

JSON 对象:

JSON 对象在花括号中书写:对象可以包含多个名称/值对:

{ "firstName":"John" , "lastName":"Doe" }

JSON 数组

JSON 数组在方括号中书写:

数组可包含多个对象:

{"employees": [{ "firstName":"John" , "lastName":"Doe" },{ "firstName":"Anna" , "lastName":"Smith" },{ "firstName":"Peter" , "lastName":"Jones" }]}
  具体可以参考http://json.org/。
可以看看下面这几幅图(类似编译原理上的自动机对应的转化图):





五.java script中的eval方法与json格式
    一般情况下,我们的json数据都是从服务端获取到的,获取的json数据是以字符串的形式返回的。这个字符串虽然是json格式的,但是不能被直接使用,我们必须将该字符串转化为一个对象才能正常解析它,eval()函数可以用来将字符串转化为js代码。
    例如:      
var data = "{'name':'rowandjj'}";//这是一个字符串!   data = eval("("+data+")");alert(data.name);//输出rowandjj
 我们注意到在eval函数中我们加了一个小括号,这是为什么呢?
    加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
六.解析json数据
   json数据的解析方式有几十种,比较常用的有google的Gson,json-org,另外就是json-lib。
这里以json-lib为例:
    步骤:
        1.导入json-lib.jar包及其依赖包:
commons-beanutils,commons-collections,commons-lang,commons-logging,ezmorph.
        2.编写代码:
package cn.edu.chd.test;import java.util.ArrayList;import java.util.List;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import net.sf.json.JsonConfig;import cn.edu.chd.domain.Person;/** * @author Rowand jj * *使用json-lib解析与构造json数据 */public class JSONDemo{    public static void main(String[] args)    {//        func1();//        func2();        func3();    }        /**     * 转换javabean到json格式     */    public static void func1()    {        Person p = new Person("rowandjj",23);        JSONObject jsonObj = JSONObject.fromObject(p);//构造jsonobject对象,参数是一个javabean对象                System.out.println(jsonObj.toString());//将java对象转化为json数据--->{"age":23,"name":"rowandjj"}        System.out.println(jsonObj.getString("name"));//可以获取到属性值---->rowandjj    }        /**     * 将list<javabean>集合转化为json数据     */    public static void func2()    {        List<Person> list = new ArrayList<Person>();        list.add(new Person("zhangsan",11));        list.add(new Person("lisi",12));        list.add(new Person("wangwu",13));                JSONArray jsonArr = JSONArray.fromObject(list);//将集合数据转化为json数据//        [{"age":11,"name":"zhangsan"},{"age":12,"name":"lisi"},{"age":13,"name":"wangwu"}]        System.out.println(jsonArr.toString());//返回结果如上                System.out.println(jsonArr.getJSONObject(0).getString("name"));//返回json数组第一个元素的name属性值,即zhangsan    }        /**     *过滤掉javabean对象中的一些属性值,将剩下的属性-值转化为json格式      */    public static void func3()    {        Person p = new Person("rowandjj",23);                JsonConfig config = new JsonConfig();        config.setExcludes(new String[]{"age"});//过滤掉age属性        JSONObject jsonObj = JSONObject.fromObject(p,config);//将过滤器传入        System.out.println(jsonObj.toString());//{"name":"rowandjj"}    }}
七.案例
   1.模拟服务端(这里用一个servlet处理请求)向客户端发送json数据, 客户端获取数据并显示。
请求的servlet:
package cn.edu.chd.web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class JSONServlet extends HttpServlet{    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException    {        resp.setContentType("text/html;charset=utf-8");        resp.setCharacterEncoding("utf-8");                PrintWriter writer = resp.getWriter();                String jsondata = "{'name':'Rowandjj','job':'student'}";//返回给客户端的json数据        writer.println(jsondata);    }
页面(部分):
    <body>        <div            style="text-align: center; font-size: 25px; font-weight: bold; color: blue;">            我的名字叫            <span id="name"></span>            <br />            我的职业是            <span id="job"></span>        </div>    </body>
js脚本:
 <script type="text/javascript">    window.onload = function() {            var xhr = createXmlHttpRequest();            xhr.open("get","/AJAX/servlet/JSONServlet?time="+new Date().getTime());            xhr.send(null);                        xhr.onreadystatechange = function()            {                if(xhr.readyState == 4)                {                    if(xhr.status == 200 || xhr.status == 304)                    {                   var data = xhr.responseText;//获取返回的json数据,注意,这里的数据是字符串类型                      data = eval("("+data+")");//将json字符串转化为json对象                        var name = data.name;                        var job = data.job;                                                document.getElementById("name").innerText = name;                        document.getElementById("job").innerText = job;                    }                }            }    }    function createXmlHttpRequest() {//创建XMLHttpRequest对象        var xmlHttp;        try { //Firefox, Opera 8.0+, Safari            xmlHttp = new XMLHttpRequest();        } catch (e) {            try { //Internet Explorer                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");            } catch (e) {                try {                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");                } catch (e) {                }            }        }        return xmlHttp;    }</script>
显示效果:


2 0
原创粉丝点击