zoukankan      html  css  js  c++  java
  • 在C#中,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类库

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

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

    首先,这里,我新建一个控制台的程序,新建一个类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序列化和反序列化必须要加的,对于其他两种方式不必加,也可以的。

    我们程序的代码:

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

    //----------------------------------------------------------------------------------------------
    //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
    using System.Runtime.Serialization.Json;
    //--------------------------------------------------------------------------------------------
    #region 1.DataContractJsonSerializer方式序列化和反序列化
                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(); 
                #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.

    这里要先引用

    //-----------------------------------------------------------------------------------------
    //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
    using System.Web.Script.Serialization;
    //----------------------------------------------------------------------------------------
    #region 2.JavaScriptSerializer方式实现序列化和反序列化
                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(); 
                #endregion
    View Code
  • 相关阅读:
    [C#]MagicLibrary.dll控件的使用(一)(下拉菜单)
    [SQL server]查询用户表及表结构
    [ASP.net]ASP.net的RUL重写
    [C#]简单XP菜单的实现(一)
    [Javascript]IFRAME运用(1)
    [ASP.net]未解的疑惑!
    [乱七八糟]Google搜索使用详细
    [Javascript]IFRAME运用(2)
    [随文杂记]残局
    [CSS]RevealTrans 滤镜
  • 原文地址:https://www.cnblogs.com/xiaoyangshu/p/12271290.html
Copyright © 2011-2022 走看看