【原创】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 ,讲的很细。

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

 

原文地址:https://www.cnblogs.com/yxhblog/p/2554576.html