Json 序列化以及反序列化的三種方式(二)


1.什么是JSON?

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

2.Json支持下面兩種數據結構

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

3.Json有下面幾種表現形式

1對象

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

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

2.數組

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

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

3.字符串

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

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

序列化和反序列化有三種方式:

  1. 使用JavaScriptSerializer
  2. 使用DataContractJsonSerializer
  3. 使用JSON.NET類庫 

我們先來看看使用 DataContractJsonSerializer的情況的引用

//----------------------------------------------------------------------------------------------
//使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中
using System.Runtime.Serialization.Json;
//---

再看看使用JavaScriptJsonSerializer的情況的引用

//-----------------------------------------------------------------------------------------
//使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中
using System.Web.Script.Serialization;
//-------------------------------------------------------------------------

最后看看使用JSON.NET的情況,引入類庫:

//使用Json.NET類庫需要引入的命名空間
//-----------------------------------------------------------------------------
using Newtonsoft.Json;
//-------------------------------------------------------------------------

最后實戰控制台代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Web.Script.Serialization;
using Newtonsoft.Json;

namespace Test_Control
{
    public class Students
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
    }
    class Test2
    {
        static void Main(string[] args)
        {
            var user = "{'name':'Manas','gender':'Male','birthday':'1987-8-8'}";

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

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

            #region 1.DataContractJsonSerializer方式序列化和反序列化
            Students stu = new Students()
            {
                ID = 1,
                Name = "曹操",
                Sex = "",
                Age = 1000
            };
            //序列化
            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Students));
            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)))
            {
                //js 反序列化為對象
                JavaScriptSerializer jss = new JavaScriptSerializer();
                var str_Object = jss.Deserialize<Students>(toDes);

                DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Students));
                Students model = (Students)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();
            答案
                {"Age":1000,"ID":1,"Name":"曹操","Sex":""}
                ID=1
                Name=曹操
                Age=1000
                Sex=#endregion

            #region 2.JavaScriptSerializer方式實現序列化和反序列化
            Students stu = new Students()
            {
                ID = 1,
                Name = "關羽",
                Age = 2000,
                Sex = ""
            };
            JavaScriptSerializer js = new JavaScriptSerializer();
            string jsonData = js.Serialize(stu);//序列化
            Console.WriteLine(jsonData);

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

            //反序列化方式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();
            答案
                {"ID":1,"Name":"關羽","Age":2000,"Sex":""}
                ID=1,Name=關羽,Age=2000,Sex=男
                動態的反序列化,ID=1,Name=關羽,Age=2000,Sex=#endregion

            #region 3.Json.NET序列化
            List<Students> lstStuModel = new List<Students>() 
           {
               new Students(){ID=1,Name="張飛",Age=250,Sex=""},
               new Students(){ID=2,Name="潘金蓮",Age=300,Sex=""}
           };
            //Json.NET序列化
            string jsonData = JsonConvert.SerializeObject(lstStuModel);
            Console.WriteLine(jsonData);

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

            輸出結果
            [{"ID":1,"Name":"張飛","Age":250,"Sex":""},{"ID":2,"Name":"潘金蓮","Age":300,"Sex":""}]
            反序列化: ID=1,Name=C#,Sex=3000,Sex=#endregion
        }
    }
}

 


免責聲明!

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



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