欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年06月14日 13:39:15   作者:Crazy Struggle  
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式。這篇文章主要介紹了.NET中JSON的序列化和反序列化的幾種方式,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

一、什么是JSON

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

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

二、JSON語法

1、JSON語法規(guī)則

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

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

對(duì)象:對(duì)象在JS中是使用花括號(hào)包裹{}起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為{key1:value1, key2:value2, ...}的鍵值對(duì)結(jié)構(gòu)。在面向?qū)ο蟮恼Z言中,key為對(duì)象的屬性, value為對(duì)應(yīng)的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。

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

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

{
  "people": [{
      "firstName": "zhang",
      "lastName": "san"
    },
    {
      "firstName": "li",
      "lastName": "si"
    }
  ]
}

2、JSON 鍵/值對(duì)

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

3、JSON 與 JS 對(duì)象的關(guān)系

JS對(duì)象的關(guān)系,可以這么理解:JSON 是 JS 對(duì)象的字符串表示法,它使用文本表示一個(gè) JS 對(duì)象的信息,本質(zhì)是一個(gè)字符串。如:

var obj = {a: 'Hello', b: 'World'};    //這是一個(gè)對(duì)象,注意鍵名也是可以使用引號(hào)包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個(gè) JSON 字符串,本質(zhì)是一個(gè)字符串

4、JSON 和 JS 對(duì)象互轉(zhuǎn)

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

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

要實(shí)現(xiàn)從 JSON 轉(zhuǎn)換為對(duì)象,使用 JSON.parse() 方法:

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

三、Json序列化方式

1、JavaScriptSerializer

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

using System.Web.Script.Serialization;

PS: 可用[ScriptIgnore] 標(biāo)記不序列化的屬性

Code:

public ActionResult GetJsonDemo()
{
  //對(duì)象
  DataModel model = new DataModel();
  model.ID = 1;
  model.Name = "ZhangSan";
  model.Sex = "女";
  model.Age = 18;

  //對(duì)象序列化Json
  string strJson= JsonHelper.ObjectToJson(model);

  //Json反序列化對(duì)象
  model= JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "對(duì)象序列化:" + strJson + "\n"+
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

public class JsonHelper
{
  #region 第一種 JavaScriptSerializer 
  //使用JavaScriptSerializer方式需要引入的命名空間,這個(gè)在程序集System.Web.Extensions.dll.中 
  //using System.Web.Script.Serialization;
  //注:可用[ScriptIgnore] 標(biāo)記不序列化的屬性
  /// <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"]; 要使用索引取值,不能使用對(duì)象.屬性
    return jsonSerialize.Deserialize<T>(strJson);
  }
  #endregion
}

Result:

 

2、JSON.NET

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

PS: 可用[JsonIgnore]標(biāo)記不序列化的屬性

Code:

public ActionResult GetJsonDemo()
{
  //對(duì)象
  DataModel model = new DataModel();
  model.ID = 2;
  model.Name = "LiSi";
  model.Sex = "男";
  model.Age = 20;

  //對(duì)象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);

  //Json反序列化對(duì)象
  model = JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "對(duì)象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

/// <summary>
/// Json 幫助類
/// </summary>
public class JsonHelper
{
  #region 第二種 JSON.NET 
  //使用Json.NET類庫需要引入的命名空間 using Newtonsoft.Json;
  //注:可用[JsonIgnore]標(biāo)記不序列化的屬性

  /// <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:

 

3、DataContractJsonSerializer

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

using System.Runtime.Serialization.Json;

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

PS: 可用[IgnoreDataMember] 標(biāo)記不序列化的屬性

Code:

public ActionResult GetJsonDemo()
{
  //對(duì)象
  DataModel model = new DataModel();
  model.ID = 3;
  model.Name = "Wangwu";
  model.Sex = "女";
  model.Age = 22;

  //對(duì)象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);

  //Json反序列化對(duì)象
  model = JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "對(duì)象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

/// <summary>
/// Json 幫助類
/// </summary>
public class JsonHelper
{
 #region 第三種 DataContractJsonSerializer
 //使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中
 //using System.Runtime.Serialization.Json;
 //注:可用[IgnoreDataMember] 標(biāo)記不序列化的屬性
 //實(shí)體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的
 //對(duì)于其他兩種方式不必加,也可以的。
 
 /// <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:

 

PS: DataModel

[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; }
}

四、總結(jié)

1、JSON序列化有三種方式

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

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET MVC4之js css文件合并功能(3)

    ASP.NET MVC4之js css文件合并功能(3)

    這篇文章主要介紹了ASP.NET MVC4之js css文件合并功能,使用BundleConfig可以將多個(gè)文件請(qǐng)求和并成一個(gè)請(qǐng)求,去除文件中的一些注釋,空白,起到優(yōu)化網(wǎng)站的作用,需要的朋友可以參考下
    2015-08-08
  • ASP.NET記錄錯(cuò)誤日志的實(shí)現(xiàn)方法

    ASP.NET記錄錯(cuò)誤日志的實(shí)現(xiàn)方法

    在本文中,我們將通過一個(gè)簡單的處理來記錄在我們的網(wǎng)站中的錯(cuò)誤和異常
    2013-05-05
  • asp.net截屏功能實(shí)現(xiàn)截取web頁面

    asp.net截屏功能實(shí)現(xiàn)截取web頁面

    這篇文章主要介紹了asp.net截屏功能實(shí)現(xiàn)截取web頁面,是非常實(shí)用的一個(gè)功能,需要的朋友可以參考下
    2014-08-08
  • 一個(gè)事半功倍的c#方法 動(dòng)態(tài)注冊(cè)按鈕事件

    一個(gè)事半功倍的c#方法 動(dòng)態(tài)注冊(cè)按鈕事件

    前幾天在網(wǎng)上看見一個(gè)制作計(jì)算器的c#程序,其中有一個(gè)動(dòng)態(tài)注冊(cè)按鈕事件,覺的很有用。于是實(shí)際操作了一哈, 確實(shí)比較好。
    2010-04-04
  • 在.NET?6中使用日志組件log4net的方法

    在.NET?6中使用日志組件log4net的方法

    本文詳細(xì)講解了Asp.Net?Core中使用日志組件log4net的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 探究ASP.NET Core Middleware實(shí)現(xiàn)方法

    探究ASP.NET Core Middleware實(shí)現(xiàn)方法

    這篇文章主要介紹了探究ASP.NET Core Middleware實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • java selenium智能等待頁面加載完成示例代碼

    java selenium智能等待頁面加載完成示例代碼

    本文主要介紹java selenium智能等待頁面加載,這里整理了相關(guān)資料并詳細(xì)講解如何實(shí)現(xiàn)智能等待頁面加載,有需要的小伙伴可以參考下
    2016-08-08
  • ASP.NET Core新建項(xiàng)目教程(3)

    ASP.NET Core新建項(xiàng)目教程(3)

    這篇文章主要為大家詳細(xì)介紹了如何在Visual Studio中創(chuàng)建一個(gè)新項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Asp.net response對(duì)象與request對(duì)象使用介紹

    Asp.net response對(duì)象與request對(duì)象使用介紹

    這篇文章主要介紹了Asp.net response對(duì)象與request對(duì)象使用,需要的朋友可以參考下
    2014-04-04
  • ASP.NET主機(jī)資源控制的一些心得

    ASP.NET主機(jī)資源控制的一些心得

    您可以通過以下設(shè)置控制ASP.NET主機(jī)對(duì)服務(wù)器內(nèi)存的占用。并能設(shè)置ASP.NET主機(jī)進(jìn)程定時(shí)重建這樣可以避免服務(wù)器長時(shí)間運(yùn)行aspnet占用大量空閑內(nèi)存,有利于提高aspnet運(yùn)行效率。
    2013-02-02

最新評(píng)論