zoukankan      html  css  js  c++  java
  • 记录Newtonsoft.Json的日常用法

    前言


    最近在做一个使用基于.net mvc 实现前后台传输Json的实例。网上找了一些资料。发现在开发的时候,许多的数据交互都是以Json格式传输的。其中涉及序列化对象的使用的有DataContractJsonSerializer,JavaScriptSerializer和Json.net即Newtonsoft.Json.其中Json.net并不是微软的类库。是一个开源的世界级的Json操作类库。相对熟悉的只有JavaScriptSerializer这个序列化对象。但是,看了资料发现使用Json.net序列化对象比使用JavaScriptSerializer序列化对象性能上简直是一个天上一个地下。以下是网上找到的它们之间的性能的对比图:

    安装Json.net


    方法1


    可去官网下载压缩版。传送地址

    方法2


    可在vs中开发工具中 选择菜单中工具->Nuget程序包管理器->程序包管理器程序台->输入 Install-Package Newtonsoft.Json -Version 11.0.2 安装即可。或者可以在选择菜单中工具->Nuget程序包管理器->管理解决方案的NuGet程序包->联机->查询到Json.net点击安装。

    注意:如果安装出现错误信息为: Newtonsoft.Json 已拥有为 Microsoft.CSharp 定义的依赖项。说明 NuGet 的版本太低。

    卸载低版本的NuGet


    第一步


    打开VS->打开菜单工具->扩展管理器->选择NuGet Package Manager->点击卸载

    第二步


    重启VS

    第三步


    在联机选项中搜索 NuGet ,找到 NuGet Package Manager 点击下载,完成自动安装。

    使用Json.net


    在需要使用的控制器中引用命名空间 using.Newtonsoft.JsonJson.Net 基础用法是直接序列化和反序列化DataTable,DataSet,Entity FrameworkEntity

    序列化


    示例代码如下:

    //序列化DataTable
    DataTable dt = new DataTable();
    dt.Columns.Add("Age", Type.GetType("System.Int32"));
    dt.Columns.Add("Name", Type.GetType("System.String"));
    dt.Columns.Add("Sex", Type.GetType("System.String"));
    dt.Columns.Add("IsMarry", Type.GetType("System.Boolean"));
    for (int i = 0; i < 4; i++)
    {
        DataRow dr = dt.NewRow();
        dr["Age"] = i + 1;
        dr["Name"] = "Name" + i;
        dr["Sex"] = i % 2 == 0 ? "男" : "女";
        dr["IsMarry"] = i % 2 > 0 ? true : false;
        dt.Rows.Add(dr);
    }
    Console.WriteLine(JsonConvert.SerializeObject(dt));        
    

    反序列化


    示例代码如下:

    string json = JsonConvert.SerializeObject(dt);
     dt=JsonConvert.DeserializeObject<DataTable>(json);
     foreach (DataRow dr in dt.Rows)
     {
       Console.WriteLine("{0}\t{1}\t{2}\t{3}\t", dr[0], dr[1], dr[2], dr[3]);
     }
    

    Json.net的高级用法


    忽略某些属性(OpIn的用法)


    示例代码如下:

    [JsonObject(MemberSerialization.OptIn)]
        //OptIn默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化。
        public partial class SysUser
        {
            public int ID { get; set; }
            public string UserName { get; set; }
            public string Email { get; set; }
            [JsonProperty]
            public string PassWord { get; set; }
            public DateTime dAddTime { get; set; }
            public virtual ICollection<SysUserRole> SysUserRole { get; set; }
        }
    

    只用密码显示,其他不显示。

    效果如图:

    忽略某些属性(OpOut的用法)


    示例代码如下:

    [JsonObject(MemberSerialization.OptOut)]
        //OptIn默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化。
        public partial class SysUser
        {
            public int ID { get; set; }
            public string UserName { get; set; }
            public string Email { get; set; }
            [JsonIgnore]
            public string PassWord { get; set; }
            public DateTime dAddTime { get; set; }
            public virtual ICollection<SysUserRole> SysUserRole { get; set; }
        }
    

    最后密码就被隐藏,其他都显示。

    效果如图:

    日期处理

    使用 Json.Net 处理的日期系统会自带iso日期标准,但是在实际的开发中大多数使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss两种格式的日期。所以,有两种解决方案:

    方案1


    Json.Net 提供了 IsoDateTimeConverter 日期转换这个类,可以通过 JsnConverter 实现相应的日期转换

    public class SysUser
        {
            public int ID { get; set; }
            public string UserName { get; set; }
            public string Email { get; set; }
            public string PassWord { get; set; }
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime dAddTime { get; set; }
        }
    

    方案2


    如若 IsoDateTimeConverter 日期格式不是我们想要的可以继承该类实现自己的日期

    示例代码如下:

     public class ChinaDateTimeConverter : DateTimeConverterBase
        {
            private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };
    
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                return dtConverter.ReadJson(reader, objectType, existingValue, serializer);
            }
    
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                dtConverter.WriteJson(writer, value, serializer);
            }
        }
    

    然后在Model中使用

    示例代码如下:

    public class SysUser
        {
            public int ID { get; set; }
            public string UserName { get; set; }
            public string Email { get; set; }
            public string PassWord { get; set; }
            [JsonConverter(typeof(ChinaDateTimeConverter))]
            public DateTime dAddTime { get; set; }
        }
    

    效果如图:

    原文

  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/ZengJiaLin/p/9578794.html
Copyright © 2011-2022 走看看