前台代碼
datalist是類似這樣的對象數據:
var datalist= new Array(); for ( var i = 1; i <= bookCount; i++) { var object = new Object(); object.id = i; object.name = "同學"+i; datalist.push(object); }
前台傳輸對象數組datalist:
function saveData(datalist){ .ajax({ type:"POST", url:base +"/save", data:{"datalist":JSON.stringify(datalist)}, dataType: "json", success:function (data){ }, error:function (){ alert("insert serv wrong"); } ); }
在這篇文章中,我們將會學到如何使用C#,來序列化對象成為Json格式的數據,以及如何反序列化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的情況,引入類庫:
下面的英文,看不懂可略過。。。
- 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.

//使用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
運行之后,結果是:
總結:最后還是盡量使用JSON.NET來序列化和反序列化,性能好。
In this article we discussed about how many ways we can implement serialization/deserialization in C#. However JSON.NET wins over other implementations because it facilitates more functionality of JSON validation, JSON schema, LINQ to JSON etc. So use JSON.NET always.