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

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

原文地址:https://www.cnblogs.com/swdhywhd/p/10506545.html

时间: 2024-09-30 00:42:23

NET Framework 3 5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON的相关文章

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点的 json 报文 问题 问题描述起来比较拗口,其实就是用Spring MVC时,如何将对象映射成 json 报文时不把对象作为json的根节点.即使用@ResponseBody的效果. 比如,默认情况下,使用ModelAndView的addObject(key,object)或者ModelMap的addAttribute(key,object)保存完Java对象,然后交给Srping的视图解析器解析成json时,

iOS网络: 把Array和Dictionaries序列化成JSON对象

你想把 Array 和 dictionary 序列化成 JSON 对象.以方便在网络中传输或者保存到磁盘中. 方案: 使用 NSJSONSerialization 这个类的 dataWithJSONObject:options:error:方法来实现. 讨论: NSJSONSerialization 这个类的 dataWithJSONObject:options:error:方法可以对数组和字典进行序列化,这些数组和字典包含的值为:NSString.NSNumber.NSArray.NSDict

使用 EntityFramework后把一个对象序列化成json字符串引起循环引用的问题

先看一个T4模板生成的model实体类 1 著作权归作者所有. 2 商业转载请联系作者获得授权,非商业转载请注明出处. 3 作者:卷猫 4 链接:http://anneke.cn/ArticleInfo/Detial/15 5 来源:Anneke.cn 6 7 //------------------------------------------------------------------------------ 8 // <auto-generated> 9 // 此代码已从模板生成.

JavaScriptSerializer序列化成Json时DateTime类型数据的处理

JavaScriptSerializer在序列化时会将DateTime的数据序列化成类似\/Date(626543800000)\/这样的值,找了很多方法都不如意,最后在一个博客找到了完美的解决方法,地址:http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/,通过自定义类型转换器的方式转换成想要的格式,转换器代码如下: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询.目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能. Newtonsoft.Json的地址: 官网:http://json.codeplex.com/ 源码地址:https://gi

Entity Framework在WCF中序列化的问题

问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的. 这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志. 这就是因为在返回数据的时候,序列化失败,导致WCF服务自动停止了. 为什么会序列化失败 为了方便说明,我们先

SpringMVC中出现&quot; 400 Bad Request &quot;错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法 今天开发过程中,在SpringMVC中的Action中处理前台ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request,后台也不报错,400指的的是请求无效(请求有语法问题或者不能满足请求),调试了好长时间

安卓开发前后台通信,从数据库中取数据并在前台以表格形式显示,以json格式传输

最近做了一个Android开发小demo,主要功能是在手机的ActionBar中的搜索栏,根据用户输入的名字从后台(java+Tomcat)数据库中取出该名字对应的一系列信息,然后通过json形式传到前台,并用表格的形式显示到前台. 跟大家分享一下,并且列出几个比较坑的点.但是只是列出了java文件和layout中的xml文件,drawable以及bean类没有列 涉及的知识点主要有: 利用HttpUrlConnection进行通信 数据库相关操作 利用json传输数据 后台代码的mvc模式 A

MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据。

MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关系型数据库和文档型NoSQL数据库集于一身. 使用说明: ###表结构 create table assets (   item_name varchar(32) primary key, -- A common attribute for all items   dynamic_cols  blo