• .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON PENGHAO


    最近要用到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

    访问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调用


    但在实现时遇到几个问题:
    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 


     

  • 相关阅读:
    PyTorch中view的用法
    pytorch lstm crf 代码理解 重点
    Pytorch Bi-LSTM + CRF 代码详解
    pytorch入坑一 | Tensor及其基本操作
    error C2440:“类型转换":无法从“void (__thiscall Play1::* )(int *)”转换为“cocos2d::SEL_CallFucN
    一行命令搞定VS2012无法安装cocos2d-x-2.1.4及创建跨平台项目(二)
    VS2012无法安装cocos2d-x-2.1.4 解决方法及VS2012新建coco2d-x项目(一)
    更换VS2012序列号的方法
    【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
    Xcode快照——管理应用程序版本
  • 原文地址:https://www.cnblogs.com/Dove/p/1322329.html
Copyright © 2020-2023  润新知