はじめに: 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
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
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.JsonSerializer4 人 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
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
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
実行結果:
{"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
2: dic.Add("Name", "Zhang San"); ("元号", "28");
4:
5: String jsonString = JsonHelper.JsonSerializer
1: "[{ "key": "名前", "value": "張三"}, {"key": "年齢", "value": "28"}]"