zoukankan      html  css  js  c++  java
  • 【原创】JSON基本操作及跨域问题

    对于这一项技术。其实很多人已经用的很熟练不过了,我就总结一下它的基础知识,以便供自己和其它初学者查看。以下内容主要讲解

    (1)JSON概念

    (2)JSON来源

    (3)JSON和XML的比较

    (4)JSON的基本格式

    (5)JSON在ASP.net中的基本应用

    (6)JSON实现跨域传输数据

    JSON是一种轻量级数据格式,是一种数据交换格式,其中部分内容来源于网络。

    (一)概念

    JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

    (二)来源

    XML——这种用于表示客户端与服务器间数据沟通管用负载的款式,几乎曾经成了Web services的同义词。然而,由于Ajax和REST技巧的揭示波及了利用过程架构,这迫使人们开始寻求`XML的轮换品,如:JavaScript Object Notation(JSON)。

    (三)JSON和XML的优缺点比较

    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

    (4)JSON的基本格式

    JSON其实和XML一样,都是一种数据格式,简单的说就是描述数据的。但是它也有自己的规则,我们先看一看它的规则:

     

    1、JSON只有两种数据类型描述符,大括号{}和方括号[],其余英文冒号:是映射符,英文逗号,是分隔符,英文双引号""是定义符。

     

    2、大括号{}用来描述一组“不同类型的无序键值对集合”(每个键值对可以理解为OOP的属性描述),方括号[]用来描述一组“相同类型的有序数据集合”(可对应OOP的数组)。

     

    3、上述两种集合中若有多个子项,则通过英文逗号,进行分隔。

     

    4、键值对以英文冒号:进行分隔,并且建议键名都加上英文双引号"",以便于不同语言的解析。

     

    5、JSON内部常用数据类型无非就是字符串、数字、布尔、日期、null 这么几个,字符串必须用双引号引起来,其余的都不用,日期类型比较特殊,这里就不展开讲述了,只是建议如果客户端没有按日期排序功能需求的话,那么把日期时间直接作为字符串传递就好,可以省去很多麻烦。

     

     

     

    JSON实例

     1 // 描述一个人
     2 
     3 var person = {
     4     "Name": "Bob",
     5     "Age": 32,
     6     "Company": "IBM",
     7     "Engineer": true
     8 }
     9 
    10 // 获取这个人的信息
    11 
    12 var personAge = person.Age;
    13 
    14 // 描述几个人
    15 
    16 var members = [
    17     {
    18         "Name": "Bob",
    19         "Age": 32,
    20         "Company": "IBM",
    21         "Engineer": true
    22     },
    23     {
    24         "Name": "John",
    25         "Age": 20,
    26         "Company": "Oracle",
    27         "Engineer": false
    28     },
    29     {
    30         "Name": "Henry",
    31         "Age": 45,
    32         "Company": "Microsoft",
    33         "Engineer": false
    34     }
    35 ]
    36 
    37 // 读取其中John的公司名称
    38 
    39 var johnsCompany = members[1].Company;
    40 
    41 // 描述一次会议
    42 
    43 var conference = {
    44     "Conference": "Future Marketing",
    45     "Date": "2012-6-1",
    46     "Address": "Beijing",
    47     "Members": 
    48     [
    49         {
    50             "Name": "Bob",
    51             "Age": 32,
    52             "Company": "IBM",
    53             "Engineer": true
    54         },
    55         {
    56             "Name": "John",
    57             "Age": 20,
    58             "Company": "Oracle",
    59             "Engineer": false
    60         },
    61         {
    62             "Name": "Henry",
    63             "Age": 45,
    64             "Company": "Microsoft",
    65             "Engineer": false
    66         }
    67     ]
    68 }
    69 
    70 // 读取参会者Henry是否工程师
    71 
    72 var henryIsAnEngineer = conference.Members[2].Engineer;

    来源于http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 

    (5)JSON在ASP.net中的基本应用

    建立一个Customer.cs文件,它代表一个客户类。内容如下

     

    1  public class Customer
    2     {
    3         public int Unid { get; set; }
    4         public string CustomerName { get; set; }
    5         public string Memo { get; set; }
    6         public string Other { get; set; } 
    7 
    8     }

     

    建立一个一般处理文件Json_1.ashx,以便我们在客户端调用,代码如下:

    using Newtonsoft.Json;

     public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                //context.Response.Write("Hello World");
                Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" };
                string strJson = Newtonsoft.Json.JavaScriptConvert.SerializeObject(customer);

                context.Response.Write(strJson);
               
            }

            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }

    添加Newtonsoft.Json.dll的引用,这个需要在网上下载,主要用于JSON的序列化与反序列化,微软3.5也有相对JSON的序列化/与反序列化的dll,可以查看我的博客 序列化/反序列化 中的JSON序列化与/反序列化的操作。

    以上代码很简单,只是把一个对象序列化后返回客户端。

    再建立一个测试页面Default.aspx,代码如下:

     <script src="jquery-1.5.1.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            function GetCustomer_Ashx() {
                $.getJSON(
                 "Json_1.ashx",
                    function(data) {
                        var msg = "";
                        $.each(data, function(k, v) {
                            msg += k + "" + v + " ,";
                        })
                        alert(msg);
                    });
                }
            
        </script>
    
            <input type="button" id="btn_Submit" onclick="GetCustomer_Ashx()" value="测试" />

    测试结果我就不截图了。大家可以试试看。这就是它在ASP.NET中的基本应用了,异步去服务器请求数据,再返回到客户端。

    (6)JSON实现跨域传输数据

    需要jquery文件的支持。

    第一种方式:$.getJSON方法。这个是Jquery中的方法,它已经把JSON的相关操作封装起来了。

    因为涉及到跨域,我们就做两个项目进行模拟吧。一会我会把代码放上。

    本地的Default.aspx文件代码如下:

     1            //-------------------------------------另一种方式$.getJson//------------------------
     2 
     3            $(function() {
     4 
     5                $.getJSON("http://localhost:4424/flightResult.aspx?code=CA1998&jsoncallback=?", function(json) {
     6              
     7                     $.each(json, function(i,field){                   
     8                         alert('您查询到航班信息:票价: ' + field["price"] + ' 元,余票: ' + field["tickets"] + ' 张。');
     9                     });
    10                    
    11                });
    12            });
    13            

    远程服务器的代码如下:

    1    //使用$.getJSON方式
    2                     string jsoncallback = Request.QueryString["jsoncallback"];
    3                     string json = "[{\"code\": \"CA1998\",\"price\": 1880,\"tickets\": 235}]";            
    4                     string str = jsoncallback + "(" + json + ")";
    5                     Response.Write(str);
    6 
    7 
    8                     Response.End();

    代码结束,很简单吧,$.getJSON已经包含了跨域的功能。

    第二种方式JSOAP方式

    客户端代码如下:

     1            jQuery(document).ready(function() {
     2 
     3                $.ajax({
     4                    type: "get",
     5                    async: false,
     6                    url: "http://localhost:4424/flightResult.aspx?code=CA1998",
     7                    dataType: "jsonp",
     8                    jsonp: "callback", //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
     9                    jsonpCallback: "flightHandler", //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
    10                    success: function(json) {
    11                        alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
    12                    },
    13                    error: function() {
    14                        alert('fail');
    15                    }
    16                });
    17            });

    服务器代码如下:

    1    //使用JSONP方式
    2                     Response.Write("flightHandler({\"code\": \"CA1998\",\"price\": 1880,\"tickets\": 25});");
    3                     Response.End();

    第二种方式来源于 http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html ,讲的很细。

     转载的请注原创地址,谢谢。

     

  • 相关阅读:
    Nginx配置文件nginx.conf中文详解(转)
    windows Nginx基本使用方法
    phpstorm 找到文件修改历史
    微信小程序模拟点击出现问题解决方法
    设置头像、商品、轮播图为背景图时需要的css
    div左右居中css
    自定义方形复选框
    css 调转180度:transform: rotate(180deg);
    js字符串转数字(小数),数字转字符串
    腾讯地图key秘钥
  • 原文地址:https://www.cnblogs.com/yxhblog/p/2554576.html
Copyright © 2011-2022 走看看