NET Framework 3 5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
Posted swdhywhd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET Framework 3 5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON相关的知识,希望对你有一定的参考价值。
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net
原贴地址: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调用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
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net
以上是关于NET Framework 3 5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON的主要内容,如果未能解决你的问题,请参考以下文章
在.net core 的webapi项目中将对象序列化成json
django-rest-framework-从零开始-2-序列化类serializers.Serializer的使用
在Windows Server 2012 中安装 .NET 3.5 Framework
如果我有 .NET Framework 2.0 和 .NET Framework 3.5,是不是需要 .NET Framework 3?