如何用JavaScriptnu.xom.serializerr

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
阅读(2095)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_080064',
blogTitle:'在.NET使用JSON作为数据交换格式(JavaScriptSerializer类)',
blogAbstract:'使用System.Web.Script.Serialization.JavaScriptSerializer类System.Web.Script.Serialization.JavaScriptSerializer类是.NET类库中自带的一种JSON序列化实现,在.NET Framework3.5及以后版本中可以使用这个类,这个类位于System.Web.Extensions.dll中,使用这个类是必须添加对这个dll的引用。下面的代码是使用JavaScriptSerializer进行序列化和反序列化的例子:public static void JavaScriptSerializerDemo(){&&& User user = new User { UserId = 1, UserName',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}在中,我們實測驗證ASP.NET MVC 4的JsonResult採用JavaScriptSerializer進行JSON序列化,然而若要100%確認,其實還有更精準的做法--因為ASP.NET MVC 4是一個,Use the source, Luke!
由CodePlex取得ASP.NET MVC的,追蹤Controller.Json()可以查到以下這段,Json()會在內部建立了一個新的JsonResult物件傳回:
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
return new JsonResult
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
而深入JsonResult類別,可以在ExecuteResult()查出它是使用JavaScriptSerializer無誤!!
public override void ExecuteResult(ControllerContext context)
if (context == null)
throw new ArgumentNullException(&context&);
if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
String.Equals(context.HttpContext.Request.HttpMethod, &GET&, StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
HttpResponseBase response = context.HttpContext.R
if (!String.IsNullOrEmpty(ContentType))
response.ContentType = ContentT
response.ContentType = &application/json&;
if (ContentEncoding != null)
response.ContentEncoding = ContentE
if (Data != null)
JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
serializer.MaxJsonLength = MaxJsonLength.V
if (RecursionLimit.HasValue)
serializer.RecursionLimit = RecursionLimit.V
response.Write(serializer.Serialize(Data));
Json.NET的作者針對ASP.NET MVC的JSON序列化寫過,原則上在Controller中用它取代JsonResult就可在MVC中改以Json.NET進行序列化,但Controller.Json()預設還是會使用JavaScriptSerializer。在追蹤原始碼的過程,我留意到Controller.Json()被宣告成virtual,換句話說,只要繼承Controller建立客製版Controller類別,覆寫(Override) Json()方法改傳JsonNetResult,就能改變Controller行為,原程式不需修改就能將JavaScriptSerializer抽換成Json.NET!
以下是一個簡單的Controller改裝範例--JsonNetController:
(由於JsonRequestBehavior.DenyGet判斷的部分會用到只有System.Web.Mvc內部才能存取的錯誤息訊文字資源,此處取巧,在發生DenyGet情境時抛回JsonResult觸發原有錯誤)
using System.Collections.G
using System.L
using System.T
using System.W
using System.Web.M
namespace Newtonsoft.Json
//REF: /archive//asp-net-mvc-and-json-net.aspx
public class JsonNetResult : JsonResult
public JsonSerializerSettings SerializerSettings { }
public Formatting Formatting { }
public JsonNetResult()
SerializerSettings = new JsonSerializerSettings();
public override void ExecuteResult(ControllerContext context)
if (context == null)
throw new ArgumentNullException(&context&);
HttpResponseBase response = context.HttpContext.R
response.ContentType =
!string.IsNullOrEmpty(ContentType) ? ContentType : &application/json&;
if (ContentEncoding != null)
response.ContentEncoding = ContentE
if (Data != null)
JsonTextWriter writer = new JsonTextWriter(response.Output)
Formatting = Formatting
JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
serializer.Serialize(writer, Data); writer.Flush();
public class JsonNetController : Controller
protected override JsonResult Json(object data, string contentType,
Encoding contentEncoding, JsonRequestBehavior behavior)
if (behavior == JsonRequestBehavior.DenyGet
&& string.Equals(this.Request.HttpMethod, &GET&,
StringComparison.OrdinalIgnoreCase))
//Call JsonResult to throw the same exception as JsonResult
return new JsonResult();
return new JsonNetResult()
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding
以前篇文章的BooController為例,我們將繼承來源由Controller改為JsonNetController,原有的Json(DateTime)寫法不需修改,但輸出結果就會改為Json.NET的版本:
using System.Collections.G
using System.L
using System.N
using System.W
using System.Web.M
using System.Web.Script.S
using Newtonsoft.J
namespace MyMvc.Controllers
public class BooController : JsonNetController
public ActionResult TestJson()
return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
public ActionResult TestJsonNotAllowGet()
return Json(DateTime.Now);
public ActionResult DateJsonWtf()
WebClient wc = new WebClient();
Uri url = Request.U
string s = wc.DownloadString(
string.Format(&http://{0}:{1}/Boo/TestJson&,
url.Host, url.Port));
JavaScriptSerializer jss = new JavaScriptSerializer();
DateTime d = jss.Deserialize&DateTime&(s);
return Content(string.Format(
&Now={0:MM-dd HH:mm}, Json={2}, Restored DateTime={1:MM-dd HH:mm}&,
DateTime.Now, d, s));
public ActionResult TestJsonNetResult()
return new JsonNetResult()
Data = DateTime.Now
測試JsonRequestBehavior.DenyGet的情境,可得到與JsonResult相同的錯誤訊息:
Json(DateTime.Now)傳回結果則已變成Json.NET的:
測試在C#端以JavaScriptSerializer還原TestJson的傳回結果,資料正確無時區差異。另外,此一結果也驗證了JavaScriptSerilalizer能正確地將&T05:04:38.:00&的ISO 8601格式反序列化回DateTime。
JavaScriptSerializer在先前的中,慘敗給Json.NET及DataContractJsonSerializer,而其獨有的DateTime編碼格式,在JavaScript等異質Client端需要額外處理,缺少時區資訊衍生的轉換地雷更是惱人,歸納下來,和IE6一樣,己成該從地表消失的禍水~ 對於新建專案,若無相容性的包袱,建議一律改用Json.NET,方為王道。
歡迎推文分享:
SunMonTueWedThuFriSat2930311345678910111618202426283112345678
【工商服務】
小黑 ASP.NET MVC小改裝 - 以Json.NET取代JavaScriptSerializer
一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案,
也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。您的位置: >
ASP.NET使用JavaScriptSerializer实现序列化与反序列化
学习标签:
本文导读:在ASP.NET 中,客户端的序列化与反序列能力由Sys.Serialization.JavaScriptSerializer类的serialize和 deserialize两个静态方法提供。在服务器端,所有的序列化与反序列化能力,包括类型之间的转换,对于开发人员来说都可以由 JavaScriptSerializer类的几个方法实现的。
&JavaScriptSerializer的名字空间为:System.Web.Script.Serialization,如果要使用它,还须添加 System.Web.Extensions 库文件引用。
若要序列化对象,请使用 Serialize 方法。若要反序列化 JSON 字符串,请使用 Deserialize 或 DeserializeObject 方法。若要序列化和反序列化 JavaScriptSerializer 本身不支持的类型,请使用 JavaScriptConverter 类来实现自定义转换器。然后,使用 RegisterConverters 方法注册转换器。
简单使用方法:
C# 代码 &&复制
/**//// &summary&
/// 序列化JSON
/// &/summary&
public static string SerToJson(object entity)
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
return jsonSerializer.Serialize(entity);
2、反序列化
C# 代码 &&复制
/**//// &summary&
/// JSON反序列化
/// &/summary&
public static T DesFromJson&T&(string strJson) where T : new()
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
T model = jsonSerializer.Deserialize&T&(strJson);
if (model == null)
model = new T();
您可能感兴趣
一月好评排行榜如何处理,JavaScriptSerializer.DeserializeObject的返回对象
[问题点数:20分,结帖人u]
如何处理,JavaScriptSerializer.DeserializeObject的返回对象
[问题点数:20分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2009年2月 .NET技术大版内专家分月排行榜第三
2009年2月 .NET技术大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 javascript调用函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信