• [Json.net]快速入门


    引言

    有个朋友问了一个如何更方便的解析json格式字符串,之前也没怎么研究过json.net,就上网帮他查了一下,现学现卖的给他整了一个demo,这才发现json.net的强大,用着很方便。

    Json

    JSON(javasrcipt Object Notation)是一种轻量级的数据交换方式。拿最常见的应用举个例子,将javascript对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松的传递这个字符串,或者在异步应用程序中将字符串从web客户机传递给服务端程序。这个字符串虽然看起来比较古怪,但是javascript很容易解释它,而且json可以表示比“名称/值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

    在.net中,DataContractJsonSerializer和JavaScriptSerializer这两个类,可以操作json。但性能上和json.net相比,差了很多。

    可以借用官网的一张图看一下:

    官网地址:http://james.newtonking.com/json

    将下载的压缩文件解压,Source是源码文件夹,在bin目录下,Newtonsoft.Json.dll是编译后的程序集文件,在项目中应用该dll就行了。

    Json.net

    在项目中引用Newtonsoft.Json.dll。

    首先从最简单的例子入手,序列化DataTable对象。

    引入命名空间:

     using Newtonsoft.Json; 

    测试代码:

     1 using Newtonsoft.Json;
     2 using System.Data;
     3 namespace Wolfy.JsonNetDemo
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             DataTable dt = new DataTable();
    10             DataColumn name = new DataColumn("Name");
    11             DataColumn gender = new DataColumn("Gender");
    12             DataColumn address = new DataColumn("Address");
    13             dt.Columns.Add(name);
    14             dt.Columns.Add(gender);
    15             dt.Columns.Add(address);
    16             for (int i = 0; i < 10; i++)
    17             {
    18                 DataRow dr = dt.NewRow();
    19                 dr[0] = "Name" + i;
    20                 dr[1] = i%2==0?"":"";
    21                 dr[2] = "Address" + i;
    22                 dt.Rows.Add(dr);
    23             }
    24             //序列化为json
    25             string json = JsonConvert.SerializeObject(dt);
    26             Console.WriteLine(json);
    27             Console.Read();
    28         }
    29     }
    30 }

    结果:

    反序列化为Datatable

    1  DataTable dt1 = JsonConvert.DeserializeObject<DataTable>(json);
    2             for (int i = 0; i < dt1.Rows.Count; i++)
    3             {
    4                 DataRow dr = dt1.Rows[i];
    5                 Console.WriteLine("{0}	{1}	{2}	", dr[0], dr[1], dr[2]);
    6             }

    控制

    实现对Json.net序列化和反序列化的控制,需要JsonSerializerSettings类。

      1 var jsonSetting = new JsonSerializerSettings(); 2 string json=JsonConvert.SerializeObject(object,jsonSetting); 

    新建一个测试类:

    1     public class Employee
    2     {
    3         public string Name { get; set; }
    4         public int Age { set; get; }
    5         public string Gender { set; get; }
    6         public string DepartmentName { set; get; }
    7         public Employee Leader { set; get; }
    8     }

    空值处理

    针对应用类型,如果为NULL时,json.net如何处理,可以通过 jsonSetting.NullValueHandling的值来控制。如:

    1             var jsonSetting = new JsonSerializerSettings();
    2             jsonSetting.NullValueHandling = NullValueHandling.Ignore;
    3             jsonSetting.NullValueHandling = NullValueHandling.Include;

    一个例子:

     1             Employee employee = new Employee();
     2             employee.Name = "Wolfy";
     3             employee.Gender = "";
     4             employee.Age = 26;
     5             employee.DepartmentName = ".net开发";
     6             employee.Leader = null;
     7             var jsonSetting = new JsonSerializerSettings();
     8             jsonSetting.NullValueHandling = NullValueHandling.Ignore;
     9             string json = JsonConvert.SerializeObject(employee,jsonSetting);
    10             Console.WriteLine(json);
    11             Console.Read();

    结果:

    改为NullValueHandling.Include

    结果:

    默认值处理

    对于值类型的处理,通过设置jsonSetting.DefaultValueHandling的值来确定。同样是枚举可取Ignore,Include等,如:

     1 namespace Newtonsoft.Json
     2 {
     3     [Flags]
     4     public enum DefaultValueHandling
     5     {
     6         Include = 0,
     7         Ignore = 1,
     8         Populate = 2,
     9         IgnoreAndPopulate = 3,
    10     }
    11 }

     jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值 

    给Employee的成员使用特性   [DefaultValue(26)]设置默认值,并引入命名空间:System.ComponentModel

     1 [DefaultValue(26)] 2 public int Age { set; get; } 

    忽略默认值:

     1             Employee employee = new Employee();
     2             employee.Name = "Wolfy";
     3             employee.Gender = "";
     4             employee.Age = 26;
     5             employee.DepartmentName = ".net开发";
     6             employee.Leader = null;
     7             var jsonSetting = new JsonSerializerSettings();
     8             jsonSetting.NullValueHandling = NullValueHandling.Include;
     9             jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值
    10             string json = JsonConvert.SerializeObject(employee,jsonSetting);
    11             Console.WriteLine(json);
    12             Console.Read();

    结果:

     

    属性控制

     Json.net序列化的两种方式:OptOut和OptIn

    OptOut默认值,类中所有公共成员会被序列化,如果不想被序列化,可以使用特性JsonIgnore

    OptIn默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分时很有帮助。

     1 using Newtonsoft.Json;
     2 namespace Wolfy.JsonNetDemo
     3 {
     4     [JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
     5     public class Employee
     6     {
     7         [JsonProperty]
     8         public string Name { get; set; }
     9         
    10         public int Age { set; get; }
    11         public string Gender { set; get; }
    12         public string DepartmentName { set; get; }
    13         public Employee Leader { set; get; }
    14     }
    15 }

    序列化:

    1             Employee employee = new Employee();
    2             employee.Name = "Wolfy";
    3             employee.Gender = "";
    4             employee.Age = 26;
    5             employee.DepartmentName = ".net开发";
    6             employee.Leader = null;
    7             string json = JsonConvert.SerializeObject(employee);
    8             Console.WriteLine(json);

    结果:

     如果想忽略某个属性,比如忽略领导信息。则可以这样写:

     1 namespace Wolfy.JsonNetDemo
     2 {
     3     [JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]
     4     public class Employee
     5     {
     6         public string Name { get; set; }
     7         
     8         public int Age { set; get; }
     9         public string Gender { set; get; }
    10         public string DepartmentName { set; get; }
    11         [JsonIgnore]
    12         public Employee Leader { set; get; }
    13     }
    14 }

     [JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]可以不写,已经默认

    测试:

    1             Employee employee = new Employee();
    2             employee.Name = "Wolfy";
    3             employee.Gender = "";
    4             employee.Age = 26;
    5             employee.DepartmentName = ".net开发";
    6             employee.Leader = new Employee() {Name = "老大",Gender = "",Age = 29, DepartmentName = ".net开发"};
    7             string json = JsonConvert.SerializeObject(employee);
    8             Console.WriteLine(json);

    结果:

    不忽略结果对比:

    非公共成员序列化

     Json.net序列化对象,默认只序列化公共成员,非公共成员序列互时,需加上 [JsonProperty]特性。

    日期处理

    两种日期格式:IsoDateTimeConverter和JavaScriptDateTimeConverter

    这是json.net中带的2个日期类,默认是IsoDateTimeConverter,格式“yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK”。另一个是JavaScriptDateTimeConverter,格式“new Date(ticks)”,返回Javascript的Date对象。

    一个例子

     1     public class Employee
     2     {
     3         public string Name { get; set; }
     4         public int Age { set; get; }
     5         public string Gender { set; get; }
     6         public string DepartmentName { set; get; }
     7         //[JsonIgnore]
     8         public Employee Leader { set; get; }
     9         public DateTime BirthDay { set; get; }
    10         public DateTime EmployeDate { set; get; }
    11     }

    序列化为Javascript格式:

     1             Employee employee = new Employee();
     2             employee.Name = "Wolfy";
     3             employee.Gender = "";
     4             employee.Age = 26;
     5             employee.DepartmentName = ".net开发";
     6             employee.Leader = new Employee() {Name = "老大",Gender = "",Age = 29, DepartmentName = ".net开发"};
     7             employee.BirthDay = new DateTime(1987,3,22);
     8             employee.EmployeDate = new DateTime(2011,6,22);
     9             string json = JsonConvert.SerializeObject(employee,new JavaScriptDateTimeConverter());
    10             Console.WriteLine(json);

    序列化

    如果想要不同的日期类型成员序列化后,以不同的形式显示。

    则可以通过设置特性实现

     1     public class Employee
     2     {
     3         public string Name { get; set; }
     4         public int Age { set; get; }
     5         public string Gender { set; get; }
     6         public string DepartmentName { set; get; }
     7         //[JsonIgnore]
     8         public Employee Leader { set; get; }
     9         [JsonConverter(typeof(IsoDateTimeConverter))]
    10         public DateTime BirthDay { set; get; }
    11         [JsonConverter(typeof(JavaScriptDateTimeConverter))]
    12         public DateTime EmployeDate { set; get; }
    13     }

    结果:

    自定义日期格式:

    1             IsoDateTimeConverter newFormatTime = new IsoDateTimeConverter() { DateTimeFormat="yyyy年MM月dd日"};
    2             string json = JsonConvert.SerializeObject(employee, newFormatTime);
    3             Console.WriteLine(json);

    结果:

    总结

    json.net简单操作就介绍到这里,之后总结Linq to json的用法。

    参考

    http://james.newtonking.com/json

    http://www.360doc.com/content/13/0328/22/11741424_274568478.shtml

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3667258.html
Copyright © 2020-2023  润新知