原贴地址:http://bbs.zkinfo.com/thread-80510-1-1.html
最近要用到jQuery调用JSON,但遇到几个问题,正面将记录下遇到的问题及解决方法。
在将Object序列化成JSON时普遍是使用以下几种方式:
1. 第三方组件Newtonsoft.Json.dll来序列化。
2. 直接用StringBuilder拼接字符串。
3. .NET3.5中的DataContractJsonSerializer
很多人使用的是第三方组件来序列化,但.NET3.5中已经提供了对序列化及反序列化很好的支持,直接使用就行了,而拼接字符串的方式就更原始了,要对一
些字符串进行处理也容易出错。所以还是选择了DataContractJsonSerializer,感觉非常方便。下面就看怎么来实了:
首先创建项目,添加必要的程序集引用:System.ServiceModel.Web及System.Runtime.Serialization
创建ashx文件以便jQuery调用,当然也可以根据自己的需要创建WebServices或其它文件,代码如下
Demo.ashx
Demo.ashx
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Services;
namespace JSONDemo
{
///
<summary>
/// $codebehindclassname$ 的摘要说明
///
</summary>
[WebService(Namespace =
"http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public
class Demo : IHttpHandler
{
public
void ProcessRequest(HttpContext context)
{
context.Response.ContentType =
"text/plain";
List<User> users =
new List<User>();
#region AddUser
users.Add(new User
{
UserId =
1,
UserName =
"张三",
Birthday = DateTime.Parse("1982/1/1")
});
users.Add(new User
{
UserId =
2,
UserName =
"李四",
Birthday = DateTime.Parse("1983/2/1")
});
users.Add(new User
{
UserId =
3,
UserName =
"王五",
Birthday = DateTime.Parse("1984/3/1")
});
#endregion
string json = JsonHelper.Serialize(users);
//context.Response.Write("序列化:\r\n");
context.Response.Write(json);
//User u = JsonHelper.Deserialize<User>("");
List<User> users2 = JsonHelper.Deserialize<List<User>>(json);
//context.Response.Write("\r\n反序列化:\r\n");
foreach (User item in users2)
{
//context.Response.Write(string.Format("UserId:{0},UserName:{1},Birthday:{2}\r\n", item.UserId, item.UserName, item.Birthday));
}
}
public
bool IsReusable
{
get
{
return
false;
}
}
}
///
<summary>
/// 数据实体
///
</summary>
//[Serializable]这里是需要注意的地方
public
class User
{
public
int UserId { get; set; }
public
string UserName { get; set; }
public DateTime Birthday { get; set; }
}
///
<summary>
/// JSON序列化与反序列化辅助类
///
</summary>
public
class JsonHelper
{
public
static
string Serialize<T>(T data)
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
using (MemoryStream ms =
new MemoryStream())
{
serializer.WriteObject(ms, data);
return Encoding.UTF8.GetString(ms.ToArray());
//ms.Position = 0;
//using (StreamReader sr = new StreamReader(ms))
//{
// return sr.ReadToEnd();
//}
}
}
public
static T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms =
new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
}
}
访问Demo.ashx显示结果如下,对了这就是我们想要的数据:
[{"Birthday":"\/Date(378662400000+0800)\/","UserId":1,"UserName":"张三"},{"Birthday":"\/Date(412876800000+0800)\/","UserId":2,"UserName":"李四"},{"Birthday":"\/Date(446918400000+0800)\/","UserId":3,"UserName":"王五"}]
jQuery调用JSON代码:
jQuery调用
<script type="text/javascript">
$().ready(function() {
$.getJSON("Demo.ashx", function(data) {
var msg = [data.length];
for (var i in data) {
msg
=
"UserId:"
+ data.UserId +
",UserName:"
+ data.UserName +
",Birthday:"
+ data.Birthday;
}
alert(msg.join('\n'));
});
});
</script>
但在实现时遇到几个问题:
1. DateTime类型在实例化时如果未对DateTime属性赋值序列化时(即:DateTime.MinValue)将会报错:指定的参数已超出有效值的范围。参数名: value
在转换为 UTC 时大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法系列化为 JSON。]
根据提示是DateTime值小于DateTime.MinValue时造成的,但实际上未赋值时DateTime默认就是MinValue了,不存在小
于MinValue。莫然其妙的一个问题,但如果DateTime值为DateTime.MinValue.AddDays(1),就没问题了。所以提示
应该改成必须大于MinValue,不知道这算不算一个小BUG?
2. 当最开始序列化时发现虽然序列化的结果却是下面这样一堆字符:
[{"<Birthday>k__BackingField":"\/Date(378662400000+0800)\/","<UserId>k__BackingField":1,"<UserName>k__BackingField":"张三"},{"<Birthday>k__BackingField":"\/Date(412876800000+0800)\/","<UserId>k__BackingField":2,"<UserName>k__BackingField":"李四"},{"<Birthday>k__BackingField":"\/Date(446918400000+0800)\/","<UserId>k__BackingField":3,"<UserName>k__BackingField":"王五"}]
经查询是因为实体类声明了可序列化造成的:
[Serializable]
public class User
当然把[Serializable]去掉,结果就正常了,可这样实体类就不能实例化了?当然我们可以用其它方法来解决这一问题,用WCF中的数据契约声明实体就行(别忘了在所有属性上加上[DataMember]不然这些属性都不可访问哦。)[DataContract]
public class User
{
[DataMember]
public int UserId{get;set;}
}
完整DEMO下载:JSONDemo.rar
分享到:
相关推荐
jquery调用基于.NET Framework 3.5的WebService返回JSON数据 jquery调用基于.NET Framework 3.5的WebService返回JSON数据
Microsoft .NET Framework 3.5 Sp1离线安装 (中文清晰版) .NET Framework 3.5 Sp1安装必须联网,本文介绍了怎么样离线安装
.net Framework3.5,安装c#.net的软件需要用到5
注:Microsoft .NET Framework 3.5安装程序,因为安装程序不包含语言包, 安装过程中也需要联网安装语言包,这样带来一些麻烦。 "Microsoft .NET Framework 3.5 SP1-xp离线安装包",已经包含了安装包和语言包,运行...
MICROSOFT .NET Framework 3.5 离线安装包 win7 win8 win10 (亲自测试安装成功)
.NET Framework 3.5 SP1完整离线安装包下载地址与制作,包含.net3.5sp1下载地址(231.5MB)和语言包下载地址,制作离线安装包。
dotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线...
window server2012 .NET Framework 3.5镜像文件,从原window server2012 上提取出来的
Windows Server2012 R2 安装.NET Framework 3.5,所需SXS文件
win 2012 R2 默认没有.net framework 3.5,并且安装只有在线安装和使用完整系统镜像安装两种方式。内网环境很难安装。但是安装SQL server 2008数据库必须以这个为基础环境,所以还是很麻烦的。这个资源是专业做...
在windows server上安装.net framework 3.5方法
将K:\sources\sxs替换成下载的文件的真正位置(若是解压缩出.cab文件,最好不要放在硬盘根目录下),回车,等待进度条到100%,提示“操作成功完成”即可。再进入“打开或关闭Windows功能”,可看到net3.5已安装(有...
此压缩包中包含.net Framework 3.5部署文件,以及使用方法,解决win10以及其他系统安装.net Framework 3.5安装失败的问题,如果问题欢迎给我留言哦!
Win10 .Net framework 3.5离线安装包安装方法.txt
基于.NET3.5的JSON操作基于.NET3.5的JSON操作基于.NET3.5的JSON操作
使用很多软件或者游戏,需要.NET Framework 3.5,解决win10系统下安装 .NET Framework 3.5出现错误代码:0x800F0906
win10安装.net framework3.5,解压后将sxs文件夹放置任意不带中文的目录下,修改“win10安装.net framework3.5.txt”中的c:\sxs为你放置的目录,然后cmd打开dos窗口执行即可。亲测完全通过
方便的检测.NET Framework 3.5版本是否正确的工具,用IE等浏览器打开即可。 (本资源非原创,如有问题请联系。)
解决Window Server 2019中在安装.NET Framework 3.5功能时出错不能安装的问题