C#中,Json的序列化和反序列化的几种方式总结

简介:

什么是JSON?

 

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 

 

翻译: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类库

 

我们先来看看使用 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

 

结果是:

 

 

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

 

 

下面的英文,看不懂可略过。。。

 

Json.NET is a third party library which helps conversion between JSON text and .NET object using the JsonSerializer. The JsonSerializer converts .NET objects into their JSON equivalent text and back again by mapping the .NET object property names to the JSON property names. It is open source software and free for commercial purposes.

 

The following are some awesome【极好的】 features,

 

Flexible JSON serializer for converting between .NET objects and JSON.

 

LINQ to JSON for manually reading and writing JSON.

 

High performance, faster than .NET's built-in【内嵌】 JSON serializers.

 

Easy to read JSON.

 

Convert JSON to and from XML.

 

Supports .NET 2, .NET 3.5, .NET 4, Silverlight and Windows Phone. 

 

Let’s start learning how to install and implement:

 

In Visual Studio, go to Tools Menu -> Choose Library Package Manger -> Package Manager Console. It opens a command window where we need to put the following command to install Newtonsoft.Json.

 

Install-Package Newtonsoft.Json

 

OR

 

In Visual Studio, Tools menu -> Manage Nuget Package Manger Solution and type “JSON.NET” to search it online. Here's the figure,

 

 

//使用Json.NET类库需要引入的命名空间

//-----------------------------------------------------------------------------

using Newtonsoft.Json;

//-------------------------------------------------------------------------

 

#region 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(); 

            #endregion

 

运行之后,结果是:

 











本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1941213 ,如需转载请自行联系原作者



相关文章
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
370 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
348 1
|
8月前
|
XML JSON 编解码
从JSON到Protobuf,深入序列化方案的选型与原理
序列化是数据跨边界传输的“翻译官”,将结构化数据转为二进制流。JSON可读性强但冗余大,Protobuf高效紧凑、性能优越,成主流选择。不同场景需权衡标准化与定制优化,选最合适方案。
531 3
|
10月前
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
577 7
|
11月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
212 1
|
11月前
|
JSON Java 数据库连接
|
12月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
294 3
|
11月前
|
XML JSON Java
go语言之JSON序列化
本文介绍了Go语言中的JSON序列化与反序列化,其操作与Java类似。需要注意的是,由于Go语言的包管理机制,变量和引入包的首字母需大写,以便其他包引用。示例代码展示了如何将`Student`结构体进行JSON序列化(返回字节数组,需转为字符串)及反序列化。此外,文章还说明了通过tag(如`json`和`xml`)指定序列化变量的重要性,以避免因包间访问限制导致反序列化失败或值为null的问题。
210 0
|
12月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
554 7