C# json格式的序列化與反序列化


使用C#,來序列化對象成為Json格式的數據,以及如何反序列化Json數據到對象

Json【javascript對象表示方法】,它是一個輕量級的數據交換格式,我們可以很簡單的來讀取和寫它,並且它很容易被計算機轉化和生成,它是完全獨立於語言的。

Json支持下面兩種數據結構:

  • 鍵值對的集合--各種不同的編程語言,都支持這種數據結構;
  • 有序的列表類型值的集合--這其中包含數組,集合,矢量,或者序列,等等。

Json有下面幾種表現形式

     1.對象

  一個沒有順序的“鍵/值”,一個對象以花括號“{”開始,並以花括號"}"結束,在每一個“鍵”的后面,有一個冒號,並且使用逗號來分隔多個鍵值對。例如:

      var user = {"name":"Manas","gender":"Male","birthday":"1987-8-8"}   

     2.數組

設置值的順序,一個數組以中括號"["開始,並以中括號"]"結束,並且所有的值使用逗號分隔,例如:

var userlist = [{"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}},
                        {"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}]

     3.字符串

任意數量的Unicode字符,使用引號做標記,並使用反斜杠來分隔。例如:

var userlist = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}" 

好了,介紹完JSON,現在說正題,我們事先序列化和反序列化有三種方式:

1.使用JavaScriptSerializer類

2.使用DataContractJsonSerializer類

3.使用JSON.NET類庫

 先建立一個Student的對象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;

namespace JsonSerializerAndDeSerializer
{
    [DataContract]
   public class Student
    {
        [DataMember]
       public int ID { get; set; }

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

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

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

//Student實體中的契約 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的,對於其他兩種方式不必加,也可以的

 

1.DataContractJsonSerializer

DataContractJsonSerializer類幫助我們序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空間里。

            Student stu = new Student()
             {
                 ID = 1,
                 Name = "曹操",
                 Sex = "",
                 Age = 1000
             };
            //序列化
            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
            MemoryStream msObj = new MemoryStream();
            //將序列化之后的Json格式數據寫入流中
            js.WriteObject(msObj, stu);
            msObj.Position = 0;
            //從0這個位置開始讀取流中的數據
            StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
            string json = sr.ReadToEnd();
            sr.Close();
            msObj.Close();
            Console.WriteLine(json);


            //反序列化
            string toDes = json;
            //string to = "{\"ID\":\"1\",\"Name\":\"曹操\",\"Sex\":\"男\",\"Age\":\"1230\"}";
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes)))
            {
                DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student));
                Student model = (Student)deseralizer.ReadObject(ms);// //反序列化ReadObject
                Console.WriteLine("ID=" + model.ID);
                Console.WriteLine("Name=" + model.Name);
                Console.WriteLine("Age=" + model.Age);
                Console.WriteLine("Sex=" + model.Sex);
            }
            Console.ReadKey(); 

結果:

2.JavaScriptJsonSerializer

 

Student stu = new Student()
               {
                   ID = 1,
                   Name = "關羽",
                   Age = 2000,
                   Sex = ""
               };

            JavaScriptSerializer js = new JavaScriptSerializer();
            string jsonData = js.Serialize(stu);//序列化
            Console.WriteLine(jsonData);


            ////反序列化方式一:
            string desJson = jsonData;
            //Student model = js.Deserialize<Student>(desJson);// //反序列化
            //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
            //Console.WriteLine(message);
            //Console.ReadKey(); 


            ////反序列化方式2
            dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
            string messageDy = string.Format("動態的反序列化,ID={0},Name={1},Age={2},Sex={3}",
                modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//這里要使用索引取值,不能使用對象.屬性
            Console.WriteLine(messageDy);
            Console.ReadKey(); 

結果:

3.JSON.NET(性能最好)

 List<Student> lstStuModel = new List<Student>() 
            {
            
            new Student(){ID=1,Name="張飛",Age=250,Sex=""},
            new Student(){ID=2,Name="潘金蓮",Age=300,Sex=""}
            };

            //Json.NET序列化
            string jsonData = JsonConvert.SerializeObject(lstStuModel);

            Console.WriteLine(jsonData);
            Console.ReadKey();


            //Json.NET反序列化
            string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
            Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
            Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
            Console.ReadKey(); 

結果:

 

最佳性能序列化庫 Swifter.Json

(1): 最優秀的整型和浮點型 ToString 和 Parse 方法實現。
(2): Emit 實現的高性能對象映射工具。
(3): 本地內存分配!拒絕 .Net 托管二次內存。
(4): 使用線程緩存,讓您的程序運行越久速度越快。
(5): 內部全指針運算,相當於使用了 .Net Core 新技術 Span<T>!

 

安裝:Nuget

代碼示例

(1): 簡單使用

    public class Demo
    {
        public int Id { get; set; }

        public string Name { get; set; }
        
        public static void Main()
        {
            var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });
            var dictionary = JsonFormatter.DeserializeObject<Dictionary<string, object>>(json);
            var obj = JsonFormatter.DeserializeObject<Demo>(json);
        }
    }

 

(2): 處理重復引用

    public class Demo
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public Demo Instance { get; set; }

        public static void Main()
        {
            var jsonFormatter = new JsonFormatter(JsonFormatterOptions.MultiReferencingReference);

            var obj = new Demo() { Id = 1, Name = "Dogwei" };

            obj.Instance = obj;

            var json = jsonFormatter.Serialize(obj);

            var deser = jsonFormatter.Deserialize<Demo>(json);

            Console.WriteLine(json); // {"Id":1,"Instance":{"$ref":"#"},"Name":"Dogwei"}

            Console.WriteLine(deser.Instance == deser); // True
        }
    }

 

(3): RWField 特性

public class Demo
    {
        [RWField("First Name")]
        public string Name { get; set; }

        [RWField]
        public int Age;

        [RWField(Access = RWFieldAccess.Ignore)]
        public int Sex { get; set; }
        [RWField(Order = 1)]
        public int Id { get; set; }

        public static void Main()
        {
            var obj = new Demo() { Id = 1, Name = "Dogwei", Age = 22, Sex = 1 };

            var json = JsonFormatter.SerializeObject(obj);

            Console.WriteLine(json); // {"Id":1,"Age":22,"First Name":"Dogwei"}
        }
    }

 

(4): 設置日期格式

public class Demo
    {
        public static void Main()
        {
            var jsonFormatter = new JsonFormatter();

            jsonFormatter.SetDateTimeFormat("yyyy-MM-dd HH:mm:ss");

            var json = jsonFormatter.Serialize(DateTime.Now);

            Console.WriteLine(json); // "2019-02-13 11:03:46"
        }
    }

 

(5): 自定義類型的行為

    public class Demo
    {
        public string Name { get; set; }

        public int Sex { get; set; }

        public bool IsMan { get => Sex == 1; }

        public unsafe static void Main()
        {
            var jsonFormatter = new JsonFormatter();
            
            jsonFormatter.SetValueInterface<bool>(new MyBooleanInterface());

            var obj = new Demo() { Name = "Dogwei", Sex = 1 };

            var json = jsonFormatter.Serialize(obj);

            Console.WriteLine(json); // {"IsMan":"yes","Name":"Dogwei","Sex":1}
        }
    }

    public class MyBooleanInterface : IValueInterface<bool>
    {
        public bool ReadValue(IValueReader valueReader)
        {
            var value = valueReader.ReadString();

            switch (value)
            {
                case "yes":
                case "true":
                    return true;
                case "no":
                case "false":
                    return false;
                default:
                    return Convert.ToBoolean(value);
            }
        }

        public void WriteValue(IValueWriter valueWriter, bool value)
        {
            valueWriter.WriteString(value ? "yes" : "no");
        }
    }

 

(6): 設置緩存大小

    public class Demo
    {
        public static void Main()
        {
            HGlobalCache.MaxSize = 1024 * 500; // 500KB

            var json = JsonFormatter.SerializeObject(new { MaxJsonLength = 256000 });
        }
    }

 

(7): 序列化超大文件

public class Demo
    {
        public static void Main()
        {
            var bigObject = new BigObject();

            using (FileStream fileStream = new FileStream("/BigObject.json", FileMode.Create, FileAccess.ReadWrite))
            {
                using (StreamWriter streamWriter = new StreamWriter(fileStream))
                {
                    JsonFormatter.SerializeObject(bigObject, streamWriter);
                }
            }
        }
    }

 

(8): 使用適用小型應用程序的 XObjectRW<T>

public class Demo
    {
        public static void Main()
        {
            // Default (FastObjectInterface)    : 初始化開銷較大,內存較大,性能優異。
            // XObjectInterface                 : 初始化開銷小,內存占用少,性能也不錯。

            ValueInterface.DefaultObjectInterfaceType = typeof(XObjectInterface<>);

            var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });

            Console.WriteLine(json); // {"Id":1,"Name":"Dogwei"}
        }
    }

 

 參考:https://www.cnblogs.com/caofangsheng/p/5687994.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM