ホームページ  >  記事  >  バックエンド開発  >  ASP.NET での JSON のシリアル化と逆シリアル化

ASP.NET での JSON のシリアル化と逆シリアル化

巴扎黑
巴扎黑オリジナル
2016-12-20 09:12:561255ブラウズ

はじめに: JSON は、ブラウザーの Web ページで実行される JavaScript コード用に特別に設計されたデータ形式です。この記事では、ASP.NET での JSON のシリアル化とデコードについて紹介します。主に、JSON の簡単な紹介、ASP.NET のシリアル化と逆シリアル化の方法、およびシリアル化と逆シリアル化での日付と時刻、コレクション、辞書の処理方法について説明します。

1. JSON の概要

JSON (JavaScript Object Notation、JavaScript Object Notation) は軽量のデータ交換形式です。

JSON は、中括弧「{}」、角括弧「[]」、カンマ「,」、およびコロンで構成される「名前と値のペア」のコレクション構造です。 「:」は二重引用符「」、「」で構成され、含まれるデータ型はオブジェクト、数値、ブール値、文字列配列、NULL などです。

JSON の形式は次のとおりです。

オブジェクト (オブジェクト) は、「名前と値のペア」の順序のないコレクションです。オブジェクトは「{」で始まり、「}」で終わります。 "、複数の「名前と値のペア」はカンマで区切られます。例:

VAR user = {"名前": "Zhang San"、"性別": "男性"、"誕生日": "1980 年 8 月 8 日" }

配列 (array) は、「[」で始まり、「]」で終わる、順序付けられた値の集合です。

VAR user list = [{ "user":{"名前 ": "張三", "性別": "男性", "誕生日": "1980 年 8 月 8 日"}}, {"ユーザー": {"名前" "李思", "性別": "男性" ","誕生日":"1985 年 5 月 8 日"}}];

文字列 (string) は、バックスラッシュ エスケープを使用して二重引用符で囲まれた任意の数の Unicode 文字のコレクションです。

2 番目、JSON データのシリアル化と逆シリアル化

DataContractJsonSerializer クラスを使用して、型インスタンスを JSON 文字列にシリアル化し、JSON 文字列を型インスタンスに逆シリアル化できます。 DataContractJsonSerializer は System.Runtime.Serialization.Json 名前空間の下にあり、.NET Framework 3.5 は System.ServiceModel.Web .dll ファイルに含まれており、.NET Framework 4 への参照を System.Runtime に追加する必要があります。連載化。

DataContractJsonSerializer のシリアル化および逆シリアル化コードの使用:

1: System の使用;

2: System.Collections.Generic の使用

4: System.Web の使用;

5: 使用System.Runtime.Serialization.Json;

6: System.IO を使用します;

7: System.Text を使用します;

8:

9: ///

10:/// JSON シリアル化と逆シリアル化ヘルパークラス

11:///

12: パブリッククラス JsonHelper

13: {

14:/// <概要>

15: /// JSON シリアル化

16: ///

17: パブリック静的文字列 JsonSerializer (T T)

18: {

19: DataContractJsonSerializer Ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ミリ秒 = new MemoryStream();

21: ser.WriteObject(MS, T);

22: 文字列 jsonString = Encoding.UTF8 .GetString(ms.ToArray());

23: ms.Close() ;

24: jsonString を返す;

25:}

26:

27:/// <概要>

28:/// JSON デシリアライズ

29:///

30: パブリック静的 JsonDeserialize (string jsonString)

31: {

32: DataContractJsonSerializer SER = new DataContractJsonSerializer(typeof(T));

33: MemoryStream ミリ秒 = new MemoryStream(Encoding.UTF8.Get)バイト(jsonString)); 34: T obj = (T)ser.ReadObject(MS) ;

35: Return OBJ;

36: }

37: }

シリアル化デモ:

単純なオブジェクト人:

1: パブリック クラス パーソン

2: {

3: パブリック文字列名 {; グループ; }

4: パブリック解釈年齢 {Get; グループ; }

JSON 文字列にシリアル化:

1 : 無効な Page_Load(オブジェクト送信者、送信された EventArgs ) を保護します

2: {

3: 人物 p = new Person(); 4: p.Name = "Zhang San" 5: p.Age = 28; ;

6:

7: String jsonString = JsonHelper.JsonSerializer (P);

8: (jsonString) に返信します: }

出力結果:

{"era": 28日、"name": "Zhang San"}

逆シリアル化デモ:

1: 無効な Page_Load (オブジェクト送信者、送信された EventArgs) を保護

2: {

3: String jsonString = "{"age": 28 日, "名前": "張三"}";

4 人 P = JsonHelper.JsonDeserialize <人>(jsonString);

5:}

実行結果:

ASP.NET での JSON シリアル化と逆シリアル化は、Web.Script で JavaScriptSerializer も使用できます。 .Serializatio 名前空間では、System.Web.Extensions.dll を参照する必要があります。 JSON.NETも利用可能です。

三、JSON シリアル化と逆シリアル化の日付と時刻の処理

JSON 形式は日付と時刻を直接サポートしていません。DateTime 値は、「/Date (700000 + 0500)/」の形式で JSON 文字列として表示されます。最初の数値 (この例では 700000) は、1970 年 1 月 1 日の午前 0 時から GMT タイム ゾーンでの通常時間 (夏時間ではない) で経過したミリ秒数です。以前の時間を表すために、数値は負の値になる場合があります。 「0500」を含む例のオプション部分は、時刻がローカル タイプであること、つまり、逆シリアル化するときにローカル タイム ゾーンに変換する必要があることを示します。この部分がないと、時刻は UTC に逆シリアル化されます。

person クラスを変更し、LastLoginTime を追加します:

1: パブリック クラス パーソン

3: パブリック文字列名 {;

4: パブリック解釈年齢 {get; }

5 : public DateTime LastLoginTime {get; }

6:}

2: p.Name = "张三";

4: p.LastLoginTime = DateTime.Now;

5:

6: String jsonString = JsonHelper.JsonSerializer <人>(P);

シリアル化結果:

{"元号" : 28th, " LastLoginTime": "/Date (1294499956278 + 0800) /", "Name": "Zhang San"}

1. バックグラウンドで正規表現を使用して置換処理を変更する JsonHelper:

1: Use System;

2 : System.Collections.Generic を使用します;

3: System.Linq を使用します;

4: System.Web を使用します;

5: System.Runtime.Serialization.Json を使用します;

6: System.IO を使用します;

7: System.Text;

の使用 8: System.Text. RegularExpressionsの使用;

9:

10:/// <概要>

11:/// JSONシーケンス 12:///

13: パブリッククラス JsonHelper

14: {

15:///

16:// /JSON シリアル化

17: ///

18:パブリック静的文字列 JsonSerializer (T T)

19: {

20: DataContractJsonSerializer SER = new DataContractJsonSerializer(操作のタイプ (T));サー.WriteObject(MS, T);

23: String jsonString = Encoding.UTF8.GetString(ms.ToArray( ));

24: ms.Close(); // Json の日付文字列を置き換えます

26: String P = @"\/Date ((D+) + D+)\/" ;

27: MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);

28: 正規表現の章 = 新しい正規表現 (P);

29: jsonString = reg.Replace(jsonString, matchEvaluator);

30 : return jsonString;

31:}

32:

33:///

34:/// JSON逆シリアル化

35:/// 概要>

36: Public static JsonDeserialize (string jsonString)

37: {

38: //文字列を "YYYY-MM" の形式に変換します-DD HH:MM:SS" to "/Date ( 1294499956278 + 0800) /"形式

39: String P = @" D {4} - d {2} - d {2} S D {2}: D { 2}: D {2}";

40: MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);

41: 正規表現の章 = 新しい正規表現 (P);

42: jsonString = reg.Replace(jsonString, matchEvaluator) );

43: DataContractJsonSerializer SER = new DataContractJsonSerializer(typeof(T));

44: MemoryStream ミリ秒 = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

45: T obj = (T)ser. ReadObject(MS);

46: OBJ に戻る;

47:}

48:

49:/// <概要>

50: ///Json シリアル化時間を /date (1294499956278 +) で変換0800) 文字列の場合

51:///

52: プライベート静的文字列 ConvertJsonDateToDateString(semi)

53: {

54: 文字列結果 = String.Empty;

55 :DateTime dt = new DateTime(1970,1,1);

56: DT = dt.AddMilliseconds(long.Parse(m.Groups[1].value));

57: DT = dt.ToLocalTime();

58: 結果 = dt.ToString("YYYY- MM) -DD HH:MM:SS");

59: 結果を返します;

60: }

61:

62:///

63: ///時間文字列 Time を次のように変換します。 Json に変換します

64: ///

65: プライベート静的文字列 ConvertDateStringToJsonDate (semi)

66: {

67: 文字列結果 = String.Empty;

68: DateTime DT = DateTime .Parse(m.Groups[0].value);

69: DT = dt.ToUniversalTime();

70: タイムスパン TS = DT - DateTime.Parse("1970 -01-01"); : result = String.Format("\/Date({0}+0800)\/", ts.TotalMilliseconds);

72: 結果を返す

73:}

74:}

シリアル化のデモ:

1: 人物 p = 新しい人物();

2: p.Name = "Zhang San";

3: p.Age = 28;

4 : p.LastLoginTime = DateTime.Now;

5:

6: String jsonString = JsonHelper.JsonSerializer (P);

実行結果:

{"Era": 28th, "LastLoginTime" ": "2011-01-09 1 時 56 秒", "名前": "張三"}

逆シリアル化デモ:

JSON string = "{"年齢": 28th,"最終ログイン時刻" :"2011-01-09 00:30:00","名前": "Zhang San"}";

P = JsonHelper.JsonDeserialize <人>(JSON);

実行結果:

バックグラウンドで置換する文字列の範囲は比較的狭いため、置き換える場合はさらに面倒になります。グローバリゼーションの多言語について考えてみましょう。

2. JavaScriptを使った処理

1: 関数 ChangeDateFormat(jsondate) {

2: jsondate = jsondate.replace("/date(","").replace(")/","");

3: If (jsondate.indexOf ("+") > 0) {

4: jsondate = jsondate.substring (0, jsondate.indexOf ("+"));

5: }

6: それ以外の場合(jsondate.indexOf("-")> 0) {

7: jsondate = jsondate.substring(0, jsondate.indexOf("-"));

8:}

9:

10: VAR date = new date(parseInt function(jsondate, 10));

11: var month = date.getMonth() + 1

13: date.getFull Year() + "-" + month + "-" + currentdate を返します

14: }

簡単なデモ:

ChangeDateFormat("/Date(1294499956278+0800)/");

結果:

4、コレクション、辞書、配列の JSON シリアル化と逆シリアル化

JSON データでは、すべてのコレクション、辞書、配列は両方とも配列として表されます。

リスト シリアル:

1: リスト <人物> リスト <人物>()

2: {

3: 新しい人物() {name=" 張三"、年齢 = 28},

4: new person() {name = "李思", age = 25}

5: };

6:

7: String jsonString = JsonHelper > ;(リスト);

シリアル結果:

"[{"年齢": 28,"名前":"張三"},{"年齢": 25, "名前": "李思"}]"

辞書を JSON に直接使用することはできません。辞書の JSON への変換は、元の辞書形式と一致しませんが、辞書のキーを名前「key」の値として使用します。 「value」という名前の値。例:

1: Dictionary DIC = New Dictionary();

2: dic.Add("Name", "Zhang San"); ("元号", "28");

4:

5: String jsonString = JsonHelper.JsonSerializer >(DIC);

1: "[{ "key": "名前", "value": "張三"}, {"key": "年齢", "value": "28"}]"

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。