C#中Json序列化和反序列化总结

JSON介绍

1.什么是JSON?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换语言。

2.JSON基于两种结构:

  • “名称/值”对的集合。不同的编程语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表,或者关联数组。
  • 值的有序列表。在大部分语言中,它被实现为数组,矢量,列表,序列。

3.几种表现形式:

a.对象:
{“ID”:1,“Name”:“小王”,“Age”:20}。

b.数组:
[
{“ID”:1,“Name”:“张三”,“CreateTime”:"/Date(1631783963711)/"},{“ID”:2,“Name”:“李四”,“CreateTime”:"/Date(1631783963713)/"},{“ID”:2,“Name”:“王五”,“CreateTime”:null}
]。

c.字符串:任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:var userlist = “{\“ID\”:1,\“Name\”:\“Manas\”,\“Address\”:\“India]\”}” 。

JSON说完了,详见

4.序列化和反序列化的3中方式:

1.使用JavaScriptSerializer类

2.使用DataContractJsonSerializer类

3.使用Newtonsoft.Json(JSON.NET)类库


1.JavaScriptSerializer类

1.介绍

命名空间:
System.Web.Script.Serialization
程序集:
System.Web.Extensions.dll

2.示例

1.添加一个控制台程序。添加程序集引用,在Program类中引入System.Web.Script.Serialization命名空间。

对于 .NET Framework 4.7.2 及更高版本,请使用命名空间中的 Api System.Text.Json 进行序列化和反序列化。 对于早期版本的 .NET Framework,请使用 Newtonsoft.Js。 此类型旨在为启用了 AJAX 的应用程序提供序列化和反序列化功能。

JavaScriptSerializer类由异步通信层在内部使用,用于序列化和反序列化浏览器与 Web 服务器之间传递的数据。

2.添加一个UserInfo类:

 public class UserInfo
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int ID { get; set; }

        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime? CreateTime { get; set; }


        public UserInfo() { }
        public UserInfo(int id, string name,DateTime? createTime=null)
        {
            this.ID = id;
            this.Name = name;
            this.CreateTime = createTime;
        }
    }

3.Program类代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

namespace SerializationDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            List<UserInfo> userList = new List<UserInfo>();
            userList.Add(new UserInfo() { ID = 1, Name = "张三", CreateTime = DateTime.Now });
            userList.Add(new UserInfo() { ID = 2, Name = "李四", CreateTime = DateTime.Now });
            userList.Add(new UserInfo() { ID = 2, Name = "王五" });

            //创建一个JavaScriptSerializer对象
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            //将用户列表序列化成JSON
            string serializedResult = serializer.Serialize(userList);

            Console.WriteLine(serializedResult);
            //将JOSN反序列化成用户列表
            List<UserInfo> deserializeResult = serializer.Deserialize<List<UserInfo>>(serializedResult);
            Console.WriteLine(deserializeResult[0].Name);
            Console.WriteLine(deserializeResult[0].CreateTime.Value.ToString("yyyy-MM-dd"));
            
            Console.ReadLine();

        }
    }
}

4.F5运行,结果如下:
在这里插入图片描述

[{“ID”:1,“Name”:“张三”,“CreateTime”:"/Date(1631788856930)/"},{“ID”:2,“Name”:“李四”,“CreateTime”:"/Date(1631788856933)/"},{“ID”:2,“Name”:“王五”,“CreateTime”:null}]
张三
2021-09-16

类详情见官网


2.DataContractJsonSerializer类

1.介绍

DataContractJsonSerializer 类别是 .NET Framework 3.5 的新成员,它可以用来将对象序列化成 JSON 格式的字串,或者执行反序列化,也就是根据 JSON 格式的字串内容来建立对象,并还原对象的状态。它在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。

2.示例

1.添加一个控制台程序。添加程序集引用,并引入命名空间。

2.支持自订类型和常用的 .NET 类型,包括:string、int、double、DateTime、bool 等。
为了测试至少三层的巢状序列化,写几个简单的类别,包括 Order(订单)、OrderItem(订单细项)、Product(产品),代码如下:

    [DataContract]
    public class Order
    {
        private List<OrderItem> items;

        public Order()
        {
        }

        public Order(int id, DateTime orderDate, bool useCoupon)
        {
            this.ID = id;
            this.OrderDate = orderDate;
            this.UseCoupon = useCoupon;
            this.items = new List<OrderItem>();
        }

        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public DateTime OrderDate { get; set; }

        [DataMember]
        public bool UseCoupon { get; set; }

        [DataMember]
        public List<OrderItem> Items
        {
            get { return items; }
            set { items = value; }
        }
    }

    [DataContract]
    public class OrderItem
    {
        public OrderItem(Product product, int count)
        {
            this.Product = product;
            this.Count = count;
        }

        [DataMember]
        public Product Product { get; set; }

        [DataMember]
        public int Count { get; set; }
    }

    [DataContract]
    public class Product
    {
        public Product(string name, double price)
        {
            this.Name = name;
            this.Price = price;
        }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public double Price { get; set; }
    }

要点:欲序列化的类别需套用 DataContract attribute;同时,欲序列化的类别属性还必须套用 DataMember attribute,否则该属性不会参与序列化/反序列化过程。

3.下面JSONHelper工作类使用泛型,能使你的工作轻松些:

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace DataCJS
{
    public class JsonHelper
    {
        public static string Serialize<T>(T obj)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, obj);
                string retVal = Encoding.UTF8.GetString(ms.ToArray());                    
                return retVal;
            }
        }

        public static T Deserialize<T>(string json) 
        {
            T obj = Activator.CreateInstance<T>();
            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(ms);
            ms.Close();
            ms.Dispose();
            return obj;
        }
    }
}

4.控制台代码:

 static void Main(string[] args)
        {
            ///序列化
            Order order = new Order(1, DateTime.Now, true);
            order.Items.Add(new OrderItem(new Product("笔记本", 3000), 2));
            order.Items.Add(new OrderItem(new Product("无线键鼠", 126.9), 2));           
            string jsonStr = JsonHelper.Serialize<Order>(order);

            Console.WriteLine("\r\n序列化得到Json字符串:\r\n");         
            Console.WriteLine(jsonStr);

            ///反序列化
            Order dOrder = JsonHelper.Deserialize<Order>(jsonStr);
            Console.WriteLine("\r\n\r\n反序列化结果:");
            Console.WriteLine("\r\nOrderID: " + dOrder.ID.ToString());
            Console.WriteLine("\r\nOrderDate: " + dOrder.OrderDate.ToString("yyyy/MM/dd HH:mm:ss"));
            Console.WriteLine("\r\nUseCoupon: " + dOrder.UseCoupon.ToString());

            foreach (OrderItem item in dOrder.Items)
            {
                Console.WriteLine("\r\n==========================");
                Console.WriteLine("\r\nProduct name: " + item.Product.Name);
                Console.WriteLine("\r\nPrice: " + item.Product.Price.ToString());
                Console.WriteLine("\r\nCount: " + item.Count.ToString());
            }

            Console.ReadLine();
        }

5.运行结果如下图:
在这里插入图片描述
在这里插入图片描述

类详情见官网


3.Newtonsoft.Json(JSON.NET)

1.介绍

JSON.NET是一个开源的世界级的Json操作类库,从下面的性能对比就可以看到它的其中之一的性能优点。
在这里插入图片描述
齐全的API介绍,使用方式简单
在这里插入图片描述

2.示例

1.创建一个控制项目,在包管理器中搜索安装该包,如下图:
在这里插入图片描述
2.基本用法
Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的。下面分别举例说明序列化和反序列化。
DataTable:

 static void Main(string[] args)
        {
            //序列化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);
            }
            string dejsonstr = JsonConvert.SerializeObject(dt);
            Console.WriteLine("\r\n序列化得到Json字符串:\r\n");
            Console.WriteLine(dejsonstr);


            ///反序列化           
            Console.WriteLine("\r\n\r\n反序列化结果:");
            dt = JsonConvert.DeserializeObject<DataTable>(dejsonstr);
            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t", dr[0], dr[1], dr[2], dr[3]);
            }

            Console.ReadLine();
        }

运行程序结果如下:
在这里插入图片描述

3.高级用法
1.忽略某些属性
2.默认值的处理
3.空值的处理
4.支持非公共成员
5.日期处理
6.自定义序列化的字段名称
7.动态决定属性是否序列化
8.枚举值的自定义格式化问题
9.自定义类型转换
10.全局序列化设置
高级用法详情参考

高级用法代码比较多这里就不贴上来了,
我的学习源代码github地址,仅供学些参考,欢迎多多交流。

  • 1
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

行者之剑

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值