zoukankan      html  css  js  c++  java
  • JayRock:JSON and JSON_RPC for .Net

    JayRockJSON and  JSON_RPC for .Net

    JavaScript Object Notation(简称JSON),即一种开放式和基于文本的数据交换格式,它提供了一种标准数据交换格式,更适用于 Ajax 样式的 Web 应用程序。

    Jayrock是一个LGPL的开源的软件,实现了JSONJSON-RPC,支持微软ASP.NET框架。

    下载地址:http://developer.berlios.de/project/showfiles.php?group_id=4638

    JavaScript Object Notation (JSON) 简介

    特点:

    1、简单格式化的数据交换

    2、易于人们的读写习惯

    3、易于机器的分析和运行

    4JavaScript中使用eval()方法可以很方便的读取 JSON数据

    5JSON支持多种语言。

    语法分析:

    JSON可以用于封装数据,它是一种类似于C语言家族的语言,所以能很容易被C语言家族的语言分析

    1、对象object包含在一对{}中。

    2、对象的属性member使用[string : value]成对的表示,属性与属性之间用逗号隔开。

    3、数组array包含在一对[]中。

    4、元素elements与元素之间用逗号隔开。

    5、元素值可具有的类型:string, number, object, array, true, false, null

          JSON VS XML

      ·可读性

      JSONXML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

      ·可扩展性

      XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

      ·编码难度

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

      ·解码难度

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

      ·流行度

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

          闲话少说咱继续往下看,编译好的有2个dll, Jayrock.Json.dll 和 Jayrock.dll。Jayrock.Json 库里面比较重要的几个对象: 位于 Jayrock.Json.Jayrock 中的类 JsonWriterJsonReaderJsonTextWriterJsonTextReader 模拟 .NET Framework 类 XmlWriterXmlReaderXmlTextWriterXmlTextReader 的语义。 Jayrock.Json.Conversion.JsonConvert 类提供了用于在 .NET 类型和 JSON 之间进行转换的 ExportImport 方法。这些方法提供了分别与 XmlSerializer 类方法 SerializeDeserialize 相似的功能。

          实例胜于一切,让实例说话,看下面的例子。

         

            //创建JSON
            using (JsonTextWriter writer = new JsonTextWriter())
            {
                
    //数组:["China","Japan","Korea","USA","UK"]
                writer.WriteStartArray();
                writer.WriteString(
    "China");
                writer.WriteString(
    "Japan");
                writer.WriteString(
    "Korea");
                writer.WriteString(
    "USA");
                writer.WriteString(
    "UK");
                writer.WriteEndArray();
                Response.Write(writer.ToString() 
    + "<br/>");
            }
            
    using (JsonWriter writer = new JsonTextWriter())
            {
                
    //对象:{"Name":"JackLee","Age":"20"}
                writer.WriteStartObject();
                writer.WriteMember(
    "Name");
                writer.WriteString(
    "JackLee");
                writer.WriteMember(
    "Age");
                writer.WriteString(
    "20");
                writer.WriteEndObject();
                Response.Write(writer.ToString());
            }
           
    //解析JSON
            string jsonText = @"['Europe', 'Asia', 'Australia', 'Antarctica', 'North America', 'South America', 'Africa']";
            
    using (JsonReader reader = new JsonTextReader(new System.IO.StringReader(jsonText)))
            {
                
    while (reader.Read())
                {
                    
    if (reader.TokenClass == JsonTokenClass.String)
                    {
                        Response.Write(reader.Text);
                    }
                }
            }
           
    //数组
            string[] strArr = JsonConvert.Import(typeof(string[]), jsonText) as string[];
            
    //对象
            jsonText = @"{'Name':'JackLee','Age':'20'}";
            JsonObject obj 
    = JsonConvert.Import(typeof(JsonObject), jsonText) as JsonObject;

            obj[
    "Name"= "Martin";
            obj[
    "Age"= "30";
            jsonText 
    = JsonConvert.ExportToString(obj);
            
    //结果:{"Name":"Martin","Age":"30"}

            jsonText 
    = JsonConvert.ExportToString(new string[] { "A""B""C""D" });
            
    //结果:["A","B","C","D"]

            我们说过了Jayrock.Json.dll ,回过头来我们再来看看Jayrock.dll,在这个DLL中有Jayrock.JsonRpc.Web .JsonRpcHandler类,我们来看看这个类的一些用法,Jayrock 远程方法要求写在一个ashx中,页面请求这个ashx的时候,在ProcessRequest 中根据Request对象中的参数信息,确定请求的服务器端方法名称和参数,然后进行调用,并返回结果。还是实例先行。

            我们添加一个一般处理程序(ashx),将其修改如下:

    <%@ WebHandler Language="C#" Class="Handler" %>

    using System;
    using System.Web;
    using Jayrock.Json;
    using Jayrock.JsonRpc;
    using Jayrock.JsonRpc.Web;

    public class Handler : JsonRpcHandler
    {
        [JsonRpcMethod(
    "greetings")]
        
    public string Greetings()
        {
            
    return "Welcome to Jayrock!";
        }
    }

            前台代码我们这样写:

            

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        
    <title></title>

        
    <script type="text/javascript" src="json.js"></script>

        
    <script type="text/javascript" src="Handler.ashx?proxy"></script>

        
    <script type="text/javascript">
            
    /*<![CDATA[*/
            window.onload 
    = function() {
                
    var s = new Handler();
                alert(s.greetings()); //同步调用。
                
                s.greetings(
    function(val) {
                alert(val.result); //异步调用
                })
            }
            
    /*]]>*/
        
    </script>

    </head>
    <body>
        
    <form id="form1" runat="server">
        
    <div>
        
    </div>
        
    </form>
    </body>
    </html>

            注意:在调用一般处理程序时,一定得是src="Handler.ashx?proxy",要加上一个参数proxy。这样会自动生成一个代理js。如果想要看这个代理js,在地址栏里直接请求Handler.ashx?proxy,就可下下载到一个js文件。效果如下:

    代码
    // This JavaScript was automatically generated by
    //
     Jayrock.JsonRpc.Web.JsonRpcProxyGenerator, Jayrock, Version=0.9.8316.0, Culture=neutral, PublicKeyToken=null
    //
     on 2010年4月20日 at 11:59:15 (中国标准时间)

    // Proxy version 1.0

    function Handler(url)
    {
        
    this["greetings"= function(callback)
        {
            
    return call("greetings", [ ], callback);
        }
        
        
    /* Returns an array of method names implemented by this service. */
        
        
    this["system.listMethods"= function(callback)
        {
            
    return call("system.listMethods", [ ], callback);
        }
        
        
    /* Returns the version server implementation using the major, minor, build and revision format. */
        
        
    this["system.version"= function(callback)
        {
            
    return call("system.version", [ ], callback);
        }
        
        
    /* Returns a summary about the server implementation for display purposes. */
        
        
    this["system.about"= function(callback)
        {
            
    return call("system.about", [ ], callback);
        }
        
        
    var url = typeof(url) === 'string' ? url : 'http://localhost:17650/JayRock_Json/Handler.ashx';
        
    var self = this;
        
    var nextId = 0;

        
    function call(method, params, callback)
        {
            
    var request = { id : nextId++, method : method, params : params };
            
    return callback == null ? 
                callSync(method, request) : callAsync(method, request, callback);
        }

        
    function callSync(method, request)
        {
            
    var http = newHTTP();
            http.open(
    'POST', url, false, self.httpUserName, self.httpPassword);
            setupHeaders(http, method);
            http.send(JSON.stringify(request));
            
    if (http.status != 200)
                
    throw { message : http.status + ' ' + http.statusText, toString : function() { return message; } };
            
    var response = JSON.eval(http.responseText);
            
    if (response.error != nullthrow response.error;
            
    return response.result;
        }

        
    function callAsync(method, request, callback)
        {
            
    var http = newHTTP();
            http.open(
    'POST', url, true, self.httpUserName, self.httpPassword);
            setupHeaders(http, method);
            http.onreadystatechange 
    = function() { http_onreadystatechange(http, callback); }
            http.send(JSON.stringify(request));
            
    return request.id;
        }

        
    function setupHeaders(http, method)
        {
            http.setRequestHeader(
    'Content-Type''text/plain; charset=utf-8');
            http.setRequestHeader(
    'X-JSON-RPC', method);
        }

        
    function http_onreadystatechange(sender, callback)
        {
            
    if (sender.readyState == /* complete */ 4)
            {
                
    var response = sender.status == 200 ? 
                    JSON.eval(sender.responseText) : {};
                
                response.xmlHTTP 
    = sender;
                    
                callback(response);
            }
        }

        
    function newHTTP()
        {
            
    if (typeof(window) != 'undefined' && window.XMLHttpRequest)
                
    return new XMLHttpRequest(); /* IE7, Safari 1.2, Mozilla 1.0/Firefox, and Netscape 7 */
            
    else
                
    return new ActiveXObject('Microsoft.XMLHTTP'); /* WSH and IE 5 to IE 6 */
        }
    }

    Handler.rpcMethods 
    = ["greetings","system.listMethods","system.version","system.about"];


  • 相关阅读:
    数据库基本操作
    守护线程
    线程使用的场景
    创建多线程
    用正则表达式去截取网页里文字的方法。参数为读取的网页源代码
    文章生成器,Split方法截取字符串。从硬盘读取文件,和向硬盘存储文件参考代码
    winform 阶段学习总结
    Windowform 窗体关联数据库存储,读取图片,参考代码
    windows form窗体应用程序,建一个记事本参考代码,重点是打开,保存,另存为
    js实现相册翻页,滚动,切换,轮播功能
  • 原文地址:https://www.cnblogs.com/chjw8016/p/1716198.html
Copyright © 2011-2022 走看看