当前位置:首页 > 技能相关 > C#与C++ > 正文内容

C# 使用Newtonsoft.Json进行对象序列化、JSON反序列化的方法

admin1年前 (2024-01-04)C#与C++3930 修订时间:2024-01-05 01:15:46

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,Newtonsoft.Json无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询。

零、安装Newtonsoft.Json

image.png

零、全局公共类

public class Account
{
     public string Name { get; set; }
     public string Email { get; set; }
     public bool Active { get; set; }
     public DateTime CreatedDate { get; set; }
     public IList<string> Roles { get; set; }
}

一、对象序列化

1、通过Newtonsoft.Json.Formatting将json格式化输出

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
                Roles = new List<string> { "User", "Admin" }
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

2、序列化List集合:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> videogames = new List<string> { "HTML5", "JQ", ".NET", "C#", ".NET core" };
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(videogames);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

3、序列化Dictionary

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>
            {
                { "Name", "李飞" },
                { "Age", "34" },
                { "Email", "546262132@qq.com" }
            };
            string json1 = JsonConvert.SerializeObject(dic, Formatting.Indented);
            Console.WriteLine("格式化:");
            Console.WriteLine(json1);
            Console.WriteLine("未格式化:");
            string json2 = JsonConvert.SerializeObject(dic, Formatting.None);
            Console.WriteLine(json2);
            Console.Read();
        }
    }
}

输出结果:

image.png

4、基于枚举类型的JsonConverters转换器

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            //单独取名称或值的方式
            List<JosnEnum> list = new List<JosnEnum>{ JosnEnum.NotStartus, JosnEnum.Startus };
            string json = JsonConvert.SerializeObject(list);
            string json3 = JsonConvert.SerializeObject(list, new Newtonsoft.Json.Converters.StringEnumConverter());
            Console.WriteLine(json);
            Console.WriteLine(json3);

            //Dictionary形式取名称和值
            Dictionary<string, int> dic = new Dictionary<string, int>
            {
            {((JosnEnum)(int)JosnEnum.NotStartus).ToString() ,(int)JosnEnum.NotStartus} ,
            {((JosnEnum)(int)JosnEnum.Startus).ToString() ,(int)JosnEnum.Startus}
            };
            string dicJson = JsonConvert.SerializeObject(dic);
            Console.WriteLine(dicJson);

            //取名称,逗号间隔格式化输出
            List<JosnEnum> result = JsonConvert.DeserializeObject<List<JosnEnum>>(json3, new Newtonsoft.Json.Converters.StringEnumConverter());
            Console.WriteLine(string.Join(",", result.Select(c => c.ToString())));
            Console.Read();
        }
        public enum JosnEnum
        {
            NotStartus = 0,
            Startus = 1
        }
    }
}

输出结果:

image.png

5、序列化var匿名类型

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            var test1 = new { Name = "李飞", Age = 36 };
            var json = JsonConvert.SerializeObject(test1);
            Console.WriteLine(json);

            var test2 = new { Name = "", Age = 0 };
            string json1 = @"{'Name':'张飞','Age':'35'}";
            var result = JsonConvert.DeserializeAnonymousType(json1, test2);
            Console.WriteLine(result.Name);
            Console.Read();
        }
    }
}

输出结果:

image.png


二、JSON反序列化

1、将json反序列化对象

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {

            string json = @"{
                              'Name': 'lifei',
                              'Email': '546262132@qq.com',
                              'Active': true,
                              'CreatedDate': '2024-01-04 23:45:04',
                              'Roles': ['User','Admin']
                            }";
            Account account = JsonConvert.DeserializeObject<Account>(json);
            Console.WriteLine("姓名:" + account.Name +",邮箱:"+ account.Email);
            Console.Read();
        }
    }
}

输出结果:

image.png

2、反序列化List集合

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"['Html5','C#','.Net','.Net Core']";
            List<string> videogames = JsonConvert.DeserializeObject<List<string>>(json);
            Console.WriteLine(string.Join(",", videogames));
            Console.Read();
        }
    }
}

输出结果:

image.png

3、反序列化Dictionary

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"{'Name': '李飞','Age': '23'}";
            var Attributes = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
            Console.WriteLine(Attributes["Name"]);
            Console.WriteLine(Attributes["Age"]);
            Console.Read();
        }
    }
}

输出结果:

image.png

4、反序列化var匿名类型

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            var test2 = new { Name = "", Age = 0 };
            string json1 = @"{'Name':'张飞','Age':'35'}";
            var result = JsonConvert.DeserializeAnonymousType(json1, test2);
            Console.WriteLine(result.Name);
            Console.Read();
        }
    }
}

输出结果:

image.png


三、特殊的使用方法

1、用新JSON字符串填充指定对象的属性值

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
                Roles = new List<string> { "User", "Admin" }
            };
            string json = @"{'Active': false, 'Roles': ['Expired']}";
            JsonConvert.PopulateObject(json, account);
            Console.WriteLine(account.Active);
            Console.WriteLine(account.Email);
            Console.Read();
        }
    }
}

输出结果:

image.png

2、当对象的属性为默认值(0或null)时不序列化该属性

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Account account1 = new Account();
            string json1 = JsonConvert.SerializeObject(account1, Formatting.Indented, new JsonSerializerSettings
            {
                DefaultValueHandling = DefaultValueHandling.Ignore
            });
            Console.WriteLine(json1);

            Console.WriteLine("");
            Account account2 = new Account() { Name = "李飞" };
            string json2 = JsonConvert.SerializeObject(account2, Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings
            {
                DefaultValueHandling = DefaultValueHandling.Ignore
            });
            Console.WriteLine(json2);
            Console.Read();
        }
    }
}

输出结果:

image.png

3、忽略null值序列化

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account { Name = "李飞", Email = "546262132@qq.com" };
            string jsonIncludeNull = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(jsonIncludeNull);
            string json = JsonConvert.SerializeObject(account, Formatting.Indented, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

4、循环引用的处理方法(对象嵌套类型)

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee employee1 = new Employee { Name = "张飞" };
            Employee employee2 = new Employee { Name = "李飞" };
            employee1.Manager = employee2;
            employee2.Manager = employee1;
            string json = JsonConvert.SerializeObject(employee1, Formatting.Indented, new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
            Console.WriteLine(json);
            string json2 = JsonConvert.SerializeObject(employee2, Formatting.Indented, new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
            Console.WriteLine(json2);
            Console.Read();
        }
        public class Employee
        {
            public string Name { get; set; }
            public Employee Manager { get; set; }
        }
    }
}

输出结果:

image.png

或者变成这个样子

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee employee1 = new Employee { Name = "张飞" };
            EmployeeManager employee2 = new EmployeeManager { Name = "李飞", Manager = "测试" };
            employee1.Manager = employee2;
            string json = JsonConvert.SerializeObject(employee1, Formatting.Indented, new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
            Console.WriteLine(json);
           
            Console.Read();
        }
        public class Employee
        {
            public string Name { get; set; }
            public EmployeeManager Manager { get; set; }
        }
        public class EmployeeManager
        {
            public string Name { get; set; }
            public string Manager { get; set; }
        }
    }
}

输出结果:

image.png

5、通过ContractResolver指定属性名首字母小写

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
                Roles = new List<string> { "User", "Admin" }
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented, new JsonSerializerSettings
            {
                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            });
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

6、通过特性序列化枚举类型

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        public enum ProductStatus
        {
            NotConfirmed,
            Active, Deleted
        }
        public class Product
        {
            public string Name { get; set; }

            [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
            public ProductStatus Status { get; set; }
        }
        static void Main(string[] args)
        {
            Product user = new Product { Name = "羽绒服", Status = ProductStatus.Deleted };
            string json = JsonConvert.SerializeObject(user, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

7、指定需要序列化的属性

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        [JsonObject(MemberSerialization.OptIn)]
        public class Categroy
        {
            //Id不需要序列化
            public Guid Id { get; set; }
            [JsonProperty]
            public string Name { get; set; }
            [JsonProperty]
            public int Size { get; set; }
        }
        static void Main(string[] args)
        {
            Categroy categroy = new Categroy
            {
                Id = Guid.NewGuid(),
                Name = "上衣",
                Size = 185
            };
            string json = JsonConvert.SerializeObject(categroy, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

8、序列化对象时指定属性名

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        public class Account
        {
            [JsonProperty("name")]
            public string Name { get; set; }
            [JsonProperty("email")]
            public string Email { get; set; }
            [JsonProperty("active")]
            public bool Active { get; set; }
            [JsonProperty("createdate")]
            public DateTime CreatedDate { get; set; }
        }
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Name = "李飞",
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

9、指定属性在JSON中的顺序

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {


        public class Account
        {
            [JsonProperty(Order = 2)]
            public string Name { get; set; }
            [JsonProperty(Order = 1)]
            public string Email { get; set; }
            [JsonProperty("active")]
            public bool Active { get; set; }
            [JsonProperty("createdate")]
            public DateTime CreatedDate { get; set; }
        }
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Name = "李飞",
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

默认的排序Order = 1

10、反序列化指定属性是否必须有值必须不为null

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {


        public class Account
        {
            [JsonProperty(Required = Required.Always)]
            public string Name { get; set; }
            public string Email { get; set; }
            public bool Active { get; set; }
            [JsonProperty(Required = Required.AllowNull)]
            public DateTime? CreatedDate { get; set; }
        }
        static void Main(string[] args)
        {
            string json = @"{
                              'Name': 'lifei',
                              'Email': '546262132@qq.com',
                              'Active': true,
                              'CreatedDate': null
                            }";
            Account account = JsonConvert.DeserializeObject<Account>(json);
            Console.WriteLine(account.Name);
            Console.WriteLine(account.CreatedDate);
            Console.Read();
        }
    }
}

输出结果:

image.png

通过JsonProperty特性的Required指定反序列化行为,当反序列化行为与指定的行为不匹配时,将抛出异常,Required是枚举,Required.Always表示属性必须有值切不能为null,Required.AllowNull表示属性必须有值,但允许为null值。

11、通过特性指定null值忽略序列化

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        public class Account
        {
            [JsonProperty(Required = Required.Always)]
            public string Name { get; set; }

            public bool Active { get; set; }
            [JsonProperty(Required = Required.AllowNull, NullValueHandling = NullValueHandling.Ignore)]
            public DateTime? CreatedDate { get; set; }
            public string Email { get; set; }
        }
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Name = "李飞",
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

12、忽略不需要序列化的属性,JsonIgnore

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        public class Account
        {
            [JsonProperty(Required = Required.Always)]
            public string Name { get; set; }
            [JsonIgnore]
            public bool Active { get; set; }
            [JsonProperty(Required = Required.AllowNull, NullValueHandling = NullValueHandling.Ignore)]
            public DateTime? CreatedDate { get; set; }
            public string Email { get; set; }
        }
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Name = "李飞",
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

13、序列化或反序列化时指定日期时间格式,JsonSerializerSettings的设置对象DateFormatString属性指定日期时间格式

using System;
using Newtonsoft.Json;
namespace NewtonsoftJson
{
    class Program
    {
        public class Account
        {
            [JsonProperty(Required = Required.Always)]
            public string Name { get; set; }
            [JsonIgnore]
            public bool Active { get; set; }
            [JsonProperty(Required = Required.AllowNull, NullValueHandling = NullValueHandling.Ignore)]
            public DateTime? CreatedDate { get; set; }
            public string Email { get; set; }
        }
        static void Main(string[] args)
        {
            Account account = new Account
            {
                Name = "李飞",
                Email = "546262132@qq.com",
                Active = true,
                CreatedDate = DateTime.Now,
            };
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                DateFormatString = "yyyy-MM-dd HH:mm:ss",
                Formatting = Formatting.Indented
            };
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(account, settings);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

输出结果:

image.png

14、将DataTable转成Json

static void Main(string[] args)
{
    //这里忽略了datatable的获取方法
    DataTable dt;
    string str = ToJson(dt);
}

public static string ToJson(this DataTable dt)
{
    return JsonConvert.SerializeObject(dt, Formatting.None, new Newtonsoft.Json.Converters.DataTableConverter());
}

 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=379

分享给朋友:

相关文章

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。