JayRock:JSON and JSON_RPC for .Net
来源:互联网 发布:装修论坛 淘宝 编辑:程序博客网 时间:2024/05/01 03:46
JavaScript Object Notation(简称JSON),即一种开放式和基于文本的数据交换格式,它提供了一种标准数据交换格式,更适用于 Ajax样式的 Web 应用程序。
Jayrock是一个LGPL的开源的软件,实现了JSON和JSON-RPC,支持微软ASP.NET框架。
下载地址:http://developer.berlios.de/project/showfiles.php?group_id=4638
JavaScript Object Notation (JSON) 简介
特点:
1、简单格式化的数据交换
2、易于人们的读写习惯
3、易于机器的分析和运行
4、JavaScript中使用eval()方法可以很方便的读取 JSON数据
5、JSON支持多种语言。
语法分析:
JSON可以用于封装数据,它是一种类似于C语言家族的语言,所以能很容易被C语言家族的语言分析
1、对象object包含在一对{}中。
2、对象的属性member使用[string : value]成对的表示,属性与属性之间用逗号隔开。
3、数组array包含在一对[]中。
4、元素elements与元素之间用逗号隔开。
5、元素值可具有的类型:string, number, object, array, true, false, null
JSON VS XML:
·可读性
JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
·可扩展性
XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
·编码难度
XML有丰富的编码工具,比如Dom4j、JDom等,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 中的类JsonWriter、JsonReader、JsonTextWriter 和JsonTextReader 模拟 .NET Framework 类 XmlWriter、XmlReader、XmlTextWriter 和XmlTextReader 的语义。<!--[endif]-->Jayrock.Json.Conversion.JsonConvert类提供了用于在 .NET 类型和 JSON 之间进行转换的 Export 和 Import 方法。这些方法提供了分别与 XmlSerializer 类方法Serialize 和 Deserialize 相似的功能。
实例胜于一切,让实例说话,看下面的例子。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> //创建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),将其修改如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><%@ 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!"; }}
前台代码我们这样写:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><%@ 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文件。效果如下:
代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// 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.0function 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 != null) throw 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"];
- JayRock:JSON and JSON_RPC for .Net
- Jayrock: JSON and JSON-RPC for .NET
- Jayrock.Json
- 认识JSON+jayrock
- 学习JSON:认识JSON+jayrock
- Jayrock的json转换运用
- Jayrock的json转换运用
- Jayrock RPC的Json例子教程
- json for .net(一)
- 关于ASP.net - Jayrock:序列化与反序列化
- Reflector for .NET and Resourcer for .NET
- Json.NET and Sitemaps.NET and Utilities.NET
- Json Object转Model, Model、DataTable转Json Object (Jayrock技巧)
- Json Object转Model, Model、DataTable转Json Object (Jayrock技巧)
- Json Object转Model, Model、DataTable转Json Object (Jayrock技巧)
- Json Object转Model, Model、DataTable转Json Object (Jayrock技巧)
- PowerTCP for .NET and CC++ and ActiveX
- json for .net(二)开源的Json.Net库
- 交互设计师的五大误区
- redis结构分析——ziplist
- iOS常用小功能(获得屏幕图像、压缩图片、加边框、调整label的size)
- popupwindow在不同theme时候的bug
- 秒杀系统架构分析与实战
- JayRock:JSON and JSON_RPC for .Net
- ViewCompat的作用
- 使用Jenkins搭建持续集成服务
- BZOJ 3576: [Hnoi2014]江南乐
- 《统计学习方法》-KNN笔记和python源码
- Eclipse打包时出现export aborted because fatal lint errors
- Hibernate配置文件与映射文件详解
- windows server 2008防火墙阻止局域网不能访问解决方案
- NTFS和FAT