JSON快速入门

一、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>
显示效果:


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。