zoukankan      html  css  js  c++  java
  • 在C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。

    首先,解释一下json 

    Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。

    Json支持下面两种数据结构:

    • 键值对的集合--各种不同的编程语言,都支持这种数据结构;
    • 有序的列表类型值的集合--这其中包含数组,集合,矢量,或者序列,等等。

    Json有下面几种表现形式

         1.对象

      一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。例如:

          

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

         2.数组

    设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔,例如:

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

         3.字符串

    任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:

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

    好了,介绍完JSON,现在说正题,我们事先序列化和反序列化有三种方式:

    1.使用JavaScriptSerializer类

    2.使用DataContractJsonSerializer类

    3.使用JSON.NET类库

    我们先来看看使用 DataContractJsonSerializer的情况

    DataContractJsonSerializer类帮助我们序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。

    首先,这里,我新建一个控制台的程序,新建一个类Student

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Runtime.Serialization;
     7 
     8 namespace JsonSerializerAndDeSerializer
     9 {
    10     [DataContract]
    11    public class Student
    12     {
    13         [DataMember]
    14        public int ID { get; set; }
    15 
    16         [DataMember]
    17        public string Name { get; set; }
    18 
    19         [DataMember]
    20        public int Age { get; set; }
    21 
    22         [DataMember]
    23        public string Sex { get; set; }
    24     }
    25 }

    注意:上面的Student实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式不必加,也可以的。

    我们程序的代码:

    要先引用程序集,在引入这个命名空间

    1 //----------------------------------------------------------------------------------------------
    2 //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
    3 using System.Runtime.Serialization.Json;
    4 //--------------------------------------------------------------------------------------------
     1 #region 1.DataContractJsonSerializer方式序列化和反序列化
     2             Student stu = new Student()
     3              {
     4                  ID = 1,
     5                  Name = "曹操",
     6                  Sex = "",
     7                  Age = 1000
     8              };
     9             //序列化
    10             DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
    11             MemoryStream msObj = new MemoryStream();
    12             //将序列化之后的Json格式数据写入流中
    13             js.WriteObject(msObj, stu);
    14             msObj.Position = 0;
    15             //从0这个位置开始读取流中的数据
    16             StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
    17             string json = sr.ReadToEnd();
    18             sr.Close();
    19             msObj.Close();
    20             Console.WriteLine(json);
    21 
    22 
    23             //反序列化
    24             string toDes = json;
    25             //string to = "{"ID":"1","Name":"曹操","Sex":"男","Age":"1230"}";
    26             using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes)))
    27             {
    28                 DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student));
    29                 Student model = (Student)deseralizer.ReadObject(ms);// //反序列化ReadObject
    30                 Console.WriteLine("ID=" + model.ID);
    31                 Console.WriteLine("Name=" + model.Name);
    32                 Console.WriteLine("Age=" + model.Age);
    33                 Console.WriteLine("Sex=" + model.Sex);
    34             }
    35             Console.ReadKey(); 
    36             #endregion

    运行结果图如下:

    再看看使用JavaScriptJsonSerializer的情况:

    JavaScriptSerializer is a class which helps to serialize and deserialize JSON. It is present in namespace System.Web.Script.Serialization which is available in assembly System.Web.Extensions.dll. To serialize a .Net object to JSON string use Serialize method. It's possible to deserialize JSON string to .Net object using Deserialize<T> or DeserializeObject methods. Let's see how to implement serialization and deserialization using JavaScriptSerializer.

    这里要先引用

    1 //-----------------------------------------------------------------------------------------
    2 //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
    3 using System.Web.Script.Serialization;
    4 //----------------------------------------------------------------------------------------
     1 #region 2.JavaScriptSerializer方式实现序列化和反序列化
     2             Student stu = new Student()
     3                {
     4                    ID = 1,
     5                    Name = "关羽",
     6                    Age = 2000,
     7                    Sex = ""
     8                };
     9 
    10             JavaScriptSerializer js = new JavaScriptSerializer();
    11             string jsonData = js.Serialize(stu);//序列化
    12             Console.WriteLine(jsonData);
    13 
    14 
    15             ////反序列化方式一:
    16             string desJson = jsonData;
    17             //Student model = js.Deserialize<Student>(desJson);// //反序列化
    18             //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
    19             //Console.WriteLine(message);
    20             //Console.ReadKey(); 
    21 
    22 
    23             ////反序列化方式2
    24             dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
    25             string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}",
    26                 modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性
    27             Console.WriteLine(messageDy);
    28             Console.ReadKey(); 
    29             #endregion

    运行结果

    最后看看使用JSON.NET的情况,引入类库:

    首先安装 newtonsoft.JSON的或在Visual Studio中,工具菜单->管理NuGet包管理器解决方案和类型“JSON。网”在线搜索。如下图:

    1 //使用Json.NET类库需要引入的命名空间
    2 //-----------------------------------------------------------------------------
    3 using Newtonsoft.Json;
    4 //----------------------------------------------------------------------
     1 #region 3.Json.NET序列化
     2             List<Student> lstStuModel = new List<Student>() 
     3             {
     4             
     5             new Student(){ID=1,Name="张飞",Age=250,Sex=""},
     6             new Student(){ID=2,Name="潘金莲",Age=300,Sex=""}
     7             };
     8 
     9             //Json.NET序列化
    10             string jsonData = JsonConvert.SerializeObject(lstStuModel);
    11 
    12             Console.WriteLine(jsonData);
    13             Console.ReadKey();
    14 
    15 
    16             //Json.NET反序列化
    17             string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
    18             Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
    19             Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
    20             Console.ReadKey(); 
    21             #endregion

    运行之后,结果是:

    总结:最后还是尽量使用JSON.NET来序列化和反序列化,性能好。

  • 相关阅读:
    elasticsearch官方文档摸索
    nginx报错upstream sent invalid chunked response while reading upstream
    LRU算法的实现
    linux命令小计
    【阅读笔记】深入java虚拟机-第三部分-虚拟机执行子系统
    spring-session-data-redis导致跨域session失效
    ReentrantLock源码解读
    AbstractQueuedSynchronizer(AQS源码解读)
    Object中wait()、notify()、notifyAll()
    redis(单机模式)分布式锁的实现【已废弃】
  • 原文地址:https://www.cnblogs.com/felix-wang/p/6406953.html
Copyright © 2011-2022 走看看