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
        }
    }
}

 

posted @ 2018-01-04 17:43  革凡  阅读(3182)  评论(0编辑  收藏  举报