一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .NET中JSON的序列化和反序列化的幾種方式

.NET中JSON的序列化和反序列化的幾種方式

2020-05-27 14:03Crazy Struggle ASP.NET教程

JSON是一種輕量級的數(shù)據(jù)交換格式。這篇文章主要介紹了.NET中JSON的序列化和反序列化的幾種方式,非常具有實用價值,需要的朋友可以參考下

一、什么是JSON

JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立 于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結構使得JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升 網(wǎng)絡傳輸效率。

是JavaScript用來處理數(shù)據(jù)的一種格式,大部分是用來處理JavaScript和web服務器端之間的數(shù)據(jù)交換,把后臺web服務器的數(shù)據(jù)傳遞到前臺,然后使用JavaScript進 行處理,例如ajax等,是獨立于語言和平臺的輕量級的數(shù)據(jù)交換格式。

二、JSON語法

1、JSON語法規(guī)則

JS 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對象、數(shù)組等。但是對象和數(shù)組是比較特殊且常用的兩種類型:

  1. 對象表示為鍵值對
  2. 數(shù)據(jù)由逗號分隔
  3. 花括號保存對象
  4. 方括號保存數(shù)組

對象:對象在JS中是使用花括號包裹{}起來的內容,數(shù)據(jù)結構為{key1:value1, key2:value2, ...}的鍵值對結構。在面向對象的語言中,key為對象的屬性, value為對應的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。

?
1
{"firstName": "Brett", "lastName": "McLaughlin"}

數(shù)組:數(shù)組在JS中是方括號[]包裹起來的內容,數(shù)據(jù)結構為[".NET", "Javascript", "Python", ...]的索引結構。在JS中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可 以像對象那樣使用鍵值對,但還是索引使用得多。同樣,值的類型可以是任意類型。

?
1
2
3
4
5
6
7
8
9
10
11
{
  "people": [{
      "firstName": "zhang",
      "lastName": "san"
    },
    {
      "firstName": "li",
      "lastName": "si"
    }
  ]
}

2、JSON 鍵/值對

JSON鍵值對是用來保存JS對象的一種方式,和JS對象的寫法也大同小異,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值:  { " firstName " : " Json " } , 這很容易理解,等價于這條 JavaScript 語句:  {firstName : " Json " } 

3、JSON 與 JS 對象的關系

JS對象的關系,可以這么理解:JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。如:

?
1
2
var obj = {a: 'Hello', b: 'World'};    //這是一個對象,注意鍵名也是可以使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串

4、JSON 和 JS 對象互轉

要實現(xiàn)從對象轉換為 JSON 字符串,使用 JSON.stringify() 方法:

?
1
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結果是 '{"a": "Hello", "b": "World"}'

要實現(xiàn)從 JSON 轉換為對象,使用 JSON.parse() 方法:

?
1
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'}

三、Json序列化方式

1、JavaScriptSerializer

使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中。

?
1
using System.Web.Script.Serialization;

PS: 可用[ScriptIgnore] 標記不序列化的屬性

Code:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ActionResult GetJsonDemo()
{
  //對象
  DataModel model = new DataModel();
  model.ID = 1;
  model.Name = "ZhangSan";
  model.Sex = "女";
  model.Age = 18;
 
  //對象序列化Json
  string strJson= JsonHelper.ObjectToJson(model);
 
  //Json反序列化對象
  model= JsonHelper.JsonToObject<DataModel>(strJson);
 
  string strContent = "對象序列化:" + strJson + "\n"+
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class JsonHelper
{
  #region 第一種 JavaScriptSerializer
  //使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中
  //using System.Web.Script.Serialization;
  //注:可用[ScriptIgnore] 標記不序列化的屬性
  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string ObjectToJson(object obj)
  {
    JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
    return jsonSerialize.Serialize(obj);
  }
 
  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="strJson"></param>
  /// <returns></returns>
  public static T JsonToObject<T>(string strJson)
  {
    JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
    //jsonSerialize.Deserialize<dynamic>(strJson); //取值model["Name"]; 要使用索引取值,不能使用對象.屬性
    return jsonSerialize.Deserialize<T>(strJson);
  }
  #endregion
}

Result:

 .NET中JSON的序列化和反序列化的幾種方式

2、JSON.NET

使用Json.NET類庫需要引入的命名空間 using Newtonsoft.Json;

PS: 可用[JsonIgnore]標記不序列化的屬性

Code:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ActionResult GetJsonDemo()
{
  //對象
  DataModel model = new DataModel();
  model.ID = 2;
  model.Name = "LiSi";
  model.Sex = "男";
  model.Age = 20;
 
  //對象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);
 
  //Json反序列化對象
  model = JsonHelper.JsonToObject<DataModel>(strJson);
 
  string strContent = "對象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// <summary>
/// Json 幫助類
/// </summary>
public class JsonHelper
{
  #region 第二種 JSON.NET
  //使用Json.NET類庫需要引入的命名空間 using Newtonsoft.Json;
  //注:可用[JsonIgnore]標記不序列化的屬性
 
  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string ObjectToJson(object obj)
  {
    return JsonConvert.SerializeObject(obj);
  }
 
  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="strJson"></param>
  /// <returns></returns>
  public static T JsonToObject<T>(string strJson)
  {
    return JsonConvert.DeserializeObject<T>(strJson);
  }
  #endregion
}

Result:

 .NET中JSON的序列化和反序列化的幾種方式

3、DataContractJsonSerializer

使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中。

?
1
using System.Runtime.Serialization.Json;

實體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的,對于其他兩種方式可加可不加。

PS: 可用[IgnoreDataMember] 標記不序列化的屬性

Code:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ActionResult GetJsonDemo()
{
  //對象
  DataModel model = new DataModel();
  model.ID = 3;
  model.Name = "Wangwu";
  model.Sex = "女";
  model.Age = 22;
 
  //對象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);
 
  //Json反序列化對象
  model = JsonHelper.JsonToObject<DataModel>(strJson);
 
  string strContent = "對象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/// <summary>
/// Json 幫助類
/// </summary>
public class JsonHelper
{
 #region 第三種 DataContractJsonSerializer
 //使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中
 //using System.Runtime.Serialization.Json;
 //注:可用[IgnoreDataMember] 標記不序列化的屬性
 //實體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的
 //對于其他兩種方式不必加,也可以的。
 
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public static string ObjectToJson(object obj)
 {
   using (MemoryStream stream = new MemoryStream())
   {
     DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(obj.GetType());
     jsonSerialize.WriteObject(stream, obj);
     return Encoding.UTF8.GetString(stream.ToArray());
   }
 }
 
 /// <summary>
 /// 反序列化
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="strJson"></param>
 /// <returns></returns>
 public static T JsonToObject<T>(string strJson)
 {
   using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
   {
     DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(typeof(T));
     return (T)jsonSerialize.ReadObject(stream);
   }
 }
 
 #endregion
}

Result:

 .NET中JSON的序列化和反序列化的幾種方式

PS: DataModel

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DataContract]
public class DataModel
{
  [DataMember]
  public int ID { get; set; }
 
  [DataMember]
  public string Name { get; set; }
 
  [DataMember]
  public string Sex { get; set; }
 
  [DataMember]
  public int Age { get; set; }
}

四、總結

1、JSON序列化有三種方式

  1. JavaScriptSerializer類
  2. JSON.NET類庫
  3. DataContractJsonSerializer類

2、盡量使用JSON.NET(開源)來序列化和反序列化,性能好。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/1312mn/p/9174415.html

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美曰韩一区二区三区 | 996热精品视频在线观看 | www.四虎网站 | 免费一区二区 | 欧美黑大吊 | 天天做天天爱天天一爽一毛片 | 亚洲国产成人久久99精品 | 贰佰麻豆剧果冻传媒一二三区 | 精品免费视在线观看 | 国产精品免费网站 | 精品国产自在现线拍国语 | 拿捏小说| 久久成人亚洲 | 99ri在线视频网 | 亚洲欧美日韩中文字幕网址 | 我的妹妹最近有点怪在线观看 | 日韩伦理在线免费观看 | 九九热免费在线观看 | 国产精品最新 | 天天澡夜夜澡狠狠澡 | 精品无码久久久久久久动漫 | 秋霞理论在一l级毛片 | 麻豆网| 亚洲国产欧美目韩成人综合 | 亚洲免费色 | 成人免费淫片95视频观看网站 | 视频免费视频观看网站 | 91麻豆国产精品91久久久 | 精品无人区乱码1区2区3区在线 | 国产亚洲精品网站 | 女人被男人躁得好爽免费视频 | 欧美日韩精品乱国产 | 1024亚洲天堂 | 麻豆视频免费在线播放 | 日本一级不卡一二三区免费 | 999久久精品国产 | 精品国产91久久久久久久 | 2023毛片| 手机看片国产免费久久网 | 四虎影院最新网址 | 超鹏97国语 |