用JSON做数据传输格式中的一些问题总结_json

向客户端提供JSON数据的方式
一. 用WCF提供Json数据
用WCF向客户端提供Json数据我们需要注意,
A. 契约的定义, 在WebInvokeAttribute 或者 WebGetAttribute中的ResponseFormat设置为WebMessageForm.Json,

复制代码 代码如下:

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "IsExistSSID/{SSID}", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

B. EndPointBehavior使用WebHttp

复制代码 代码如下:

<behavior name="UIAjaxEndpointBehavior">
<webHttp />
<PolicyEndPointBehavior />
</behavior>

C. Binding 方式使用webHttpBinding

复制代码 代码如下:

<service name="XX.DeviceUIService" behaviorConfiguration="UIAjaxServiceBehavior">
<endpoint address="" behaviorConfiguration="UIAjaxEndpointBehavior"
binding="webHttpBinding" contract="DeviceUIServiceContract" />
</service>

二. 用.Net MVC Action提供 JSON 数据
1. 在ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())中加入 Json 数据的处理, MVC 3默认是加入的, 如果你使用的是 MVC3, 则无需理会这一点.
2. 采用JsonResult作为你Action的返回值。
3.返回是使用return Json(XXX); XXX为你要返回的数据,其数据类型必须为可序列化类型.
三. 可采用以asmx为后缀名的简单WebService来实现,
四. 使用HttpHandler机制来实现.
因为WCF已被微软定义为微软系下的通信平台,而后两种随可以实现,但是是较早的实现方式,所以在此我使用了WCF,直接把所提供的数据,视作系统的数据提供接口.
而在.NET MVC的环境里, 已经直接支持输出 Json 形式的数据,所以在非.NET MVC的环境选择WCF提供, 而在.NET MVC环境直接选择用JSON Action支持.
WEB客户端处理
用JQuery Ajax处理
把 dataType设置为 'json' 格式,在接收数据时会自动把result转换为json object格式.

复制代码 代码如下:

$.ajax({
url: ‘urladdress'
type: 'GET',
contentType: 'application/json',
dataType: 'json',
cache: false,
async: false,
error: JQueryAjaxErrorHandler,
success: function (result) { }
});

异常处理的考虑


在这里我主要考虑在Web环境下异常的处理, 根据HTTP协议的定义, 每次请求都会返回一个 HTTP Status Code , 不同的Code代表了不同的意义。因此我们的Web应用程序也应该是这样,根据不同的结果返回不同的 HTTP Status Code , 比如200,代表服务端正确的返回,417代表我们期望的服务端异常,404,请求不存在等, 以及301我们的未授权。

在WCF环境下,我们首先要给每个方法添加 FaultContract, 如下:
FaultContract(typeof(WebFaultException<WebErrorDetail>))
其次我们要对异常做一些处理,让服务端能返回正确的HTTP Status Code.

复制代码 代码如下:

try
{
//BussinessCode.....
}
catch (DuplicateException ex)
{
throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
}
catch (NotExistException ex)
{
throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
}
catch (AppException ex)
{
throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
}
catch (Exception ex)
{
throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
}
其中WebFaultJsonFormatException的签名如下:
[Serializable, DataContract]
public class WebFaultJsonFormatException<T> : WebFaultException<T>
{
public WebFaultJsonFormatException(T detail, HttpStatusCode statusCode)
: base(detail, statusCode)
{
ErrorDetailTypeValidator(detail);
}
public WebFaultJsonFormatException(T detail, HttpStatusCode statusCode, IEnumerable<Type> knownTypes)
: base(detail, statusCode, knownTypes)
{
ErrorDetailTypeValidator(detail);
}
private void ErrorDetailTypeValidator(T detail)
{
foreach (DataContractAttribute item in detail.GetType().GetCustomAttributes(typeof(DataContractAttribute), true))
{
if (item.IsReference)
throw new WebFaultJsonFormatException<PureWebErrorDetail>(new PureWebErrorDetail("The DataContractAttribute property 'IsReference' which applied on {0} can't be true when the transfer code type is JSON fromat.", typeof(T).FullName), HttpStatusCode.ExpectationFailed);
}
}
}
[Serializable, DataContract(IsReference = false)]
public class PureWebErrorDetail
{
public PureWebErrorDetail(string message, params object[] args)
{
this.Message = string.Format(message, args);
}
[DataMemberAttribute]
public string Message { get; set; }
}

因为我们在JSON做数据传输的时候, DataContract中的IsReference是不可以为true的,其意思是相对于XML来说的,XML是可以支持数据的循环引用, 而JSON是不支持的,所以WebFaultJsonFormatException的作用就在于判断当前我们的JSON数据类型的DataContract的IsReference是否为true, 如果是,则返回一个我们定义好的错误信息. 如果没有采用这个定义,JQUery Ajax因此问题接收到的 HTTP Status Code 是15???的一个错误代码, 但这个错误代码并不是我们正常的 HTTP Status Code 范围.

异常处理的一个误区
最早的时候,由于没想到用这个方式处理,也是长久写代码犯下的一个弊病, 给每个方法加了一个固定的泛型返回值类型

复制代码 代码如下:

[DataContract]
public class TmResult
{
[DataMember]
public bool Success { get; set; }

[DataMember]
public string ErrorMessage { get; set; }

[DataMember]
public string FullMessage { get; set; }

[DataMember]
public string CallStack { get; set; }
}

[DataContract]
public class TmResult<T> : TmResult
where T : class
{
[DataMember]
public T Model { get; set; }
}

每次返回都会有一个Success代表是否成功, ErrorMessage代表错误情况下的错误信息, 这样做的方式其实就是每次返回的 HTTP Status Code 都是200, 后来知道想到上面的解决办法之后,才觉得我们更本不需要搞的这么复杂,既然是Web, 那干吗不把程序写的更符合HTTP协议的定义, 那样岂不更简单。

所以在此也体会到各种标准的好处, 熟悉标准,熟悉编程模型及各种API, 我们的开发会更简单,更轻松.
以上都是按个人理解所写,有不对之处请指正.

时间: 2024-09-21 08:27:04

用JSON做数据传输格式中的一些问题总结_json的相关文章

如果用JSON做数据传输的接口

问题描述 本人对JSON不太了解,最近要做一个Socket服务接口,本来之前是用xml,但是别人在调用接口的时候,传输的xml格式容易出错,所以,想改成JSON.由于对JSON还不太了解,就是不知道别人序列化后的东西,我能反序列化么?比方说:对方将一个User实体对象转成JSON,我接收后,能通过我这边的实体类User给解析出来么?还有,像DataTable之类的可以转JSON传输么?平台是服务接口为C#,客户端可能是java或者其他等! 解决方案 解决方案二:下载一个Newtonsoft.Js

用什么办法(函数)顺序读出获取的JSON格式中的关键字

问题描述 比如数组中内容可以拿索引获取:Map集合通过keySet()函数可以返回该Map中所有key所组成的Set集合.那么有什么办法(函数)顺序读出获取的JSON格式中的关键字,从而可以得到对应数值. 解决方案 var arr = {'a':1,'b";2,'c':3};for(var i in arr){ alert(i+":"+arr[i]);}

开发流程- 公司要与其他网站合作,要求开发api接口,供合作方调用,返回的数据是json或xml格式的

问题描述 公司要与其他网站合作,要求开发api接口,供合作方调用,返回的数据是json或xml格式的 请问这个开发流程大概是怎样的?求解..................................................... 解决方案 asp.net webapi非常适合做这个,你只要按照你原来的方式编写函数调用,它会自动将提交的数据转换成对象,作为参数传入,以及传出的参数转换成json返回. 解决方案二: 不管你后台用.net还是java还是php,你只需要公布一个可以访问的

使用 C++ 处理 JSON 数据交换格式 .

使用 C++ 处理 JSON 数据交换格式   一.摘要     JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式. 本文并不详细介绍 JSON 本身的细节,旨在讨论如何使用 C++ 语言来处理 JSON.关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org.   二.本文选择处理 JSON的 C++ 库   

myflow.js怎么实现删除节点,保存时json 转jpdl格式的XML?

问题描述 myflow.js怎么实现删除节点,保存时json 转jpdl格式的XML? 项目中向用myflow.js做工作流流程设计器.实现类似这样的效果.http://gekie.iteye.com/blog/2230861 解决方案 删除的时候你选中节点按delete键就可以删除了,转换为jpdl不懂是什么,没搞过..自己eval转为json对象后变量转为换就行了 $('#myflow') .myflow( { tools : { save : { onclick: function (da

js/jquery解析json和数组格式的方法详解

 本篇文章主要是对js/jquery解析json和数组格式的方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在解析之前,我们必须弄清楚几个概念:数组,关联数组以及json之间有哪些区别和联系点?   一.概念介绍 1.数组   语法:  ECMAScript v3规定了数组直接量的语法,JavaScript 1.2和JScript 3.0实现了它.可以把-个用逗号分隔的表达式列表放在方括号中,创建并初始化-个数组.这些表达式的值将成为数组元素.例如:   var a = [1

浅析json与jsonp区别及通过ajax获得json数据后格式的转换_AJAX相关

 有关json与jsonp的区别(json才是目的,jsonp只是手段)介绍如下所示: 一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展.简单地讲,json其实就是JavaScript中的对象(Object)和数组(Array,其实也是对象)这倆好基友在那儿你嵌我我嵌你地套上n多层,以此模拟出许多复杂的数据结构. json易于人阅读和编写,也易于

hibernate-Hibernate可以返回json或者JsonArray格式的对象吗?

问题描述 Hibernate可以返回json或者JsonArray格式的对象吗? 现在好多项目前端都是json的了 Hibernate返回的List,无法和前端的进行匹配 解决方案 不可以的,只能返回Java对象,然后你可以用JSON操作api把Java对象转成JSON字符串就好了啊. 解决方案二: 返回对象的json格式 解决方案三: 只能写个共通方法,讲list转成json格式.这个应该准备好,因为现在基本上数据传输都是json格式了 解决方案四: Hibernate直接和前端匹配啦?将对象

解析视频文件MPEG2-PS和MPEG2-TS格式中的GPS信息,最好有代码,请高手指教,谢谢!

问题描述 解析视频文件MPEG2-PS和MPEG2-TS格式中的GPS信息,最好有代码,请高手指教,谢谢! 解决方案 解决方案二:路过帮顶=============11月6日,论坛升级公告,积分已经做了调整!http://topic.csdn.net/u/20081107/11/b27dc75f-14b1-4594-9de3-5b18d9e36a11.html此次调整增加了两个新的可用分获取渠道:1:帖子被推荐(加精)后,帖主可以获得88分的可用分奖励:2:帖子结帖后会返还帖主50%的悬赏分,无