집 >백엔드 개발 >C#.Net 튜토리얼 >ASP.NET에서 JSON 직렬화 및 역직렬화
소개: JSON은 브라우저의 웹 페이지에서 실행되는 JavaScript 코드를 위해 특별히 설계된 데이터 형식입니다. 이 문서에서는 ASP.NET에서 JSON을 직렬화하는 방법을 소개합니다. , 주로 JSON에 대한 간략한 소개, ASP.NET에서 직렬화 및 역직렬화를 처리하는 방법, 직렬화 및 역직렬화에서 날짜 및 시간, 컬렉션, 사전 처리를 설명합니다.
1. JSON 소개
JSON(JavaScript Object Notation, JavaScript object notation)은 경량 데이터 교환 형식입니다.
JSON은 중괄호 "{}", 대괄호 "[]", 쉼표 ",", 콜론으로 구성된 "이름-값 쌍"의 집합 구조입니다. ":"는 큰따옴표 '","'로 구성되며 객체, 숫자, 불리언 값, 문자열 배열, NULL 등의 데이터 유형을 포함합니다.
JSON의 형식은 다음과 같습니다.
객체(객체)는 "이름-값 쌍"의 순서가 지정되지 않은 컬렉션입니다. 객체는 각 ""에 대해 "{"로 시작하고 "}"로 끝납니다. name" "뒤에 ":"가 오며, 여러 개의 "이름-값 쌍"은 쉼표로 구분됩니다. 예:
VAR user = {"Name": "Zhang San", "Gender": "Male ", "Birthday" : "August 8, 1980"}
배열(array)은 순서가 지정된 값의 모음입니다. 배열은 "["로 시작하고 "]"로 끝납니다. 값은 다음과 같습니다. 다음과 같이 ","로 구분:
VAR user list = [{"User": {"Name": "Zhang San", "Gender": "Male", "Birthday": "8월 8일, 1980"}}, {"User": {"이름" "lee思", "Gender": "남성", "Birthday": "1985년 5월 8일"}}];
String(String ) 큰따옴표로 묶이고 백슬래시로 이스케이프된 임의 개수의 유니코드 문자 모음입니다.
두 번째, JSON 데이터 직렬화 및 역직렬화
DataContractJsonSerializer 클래스를 사용하여 유형 인스턴스를 JSON 문자열로 직렬화하고 JSON 문자열을 유형 인스턴스로 역직렬화할 수 있습니다. DataContractJsonSerializer는 System.Runtime.Serialization.Json 네임스페이스에 있습니다. .NET Framework 3.5는 System.ServiceModel.Web .dll 파일에 포함되어 있으며 이에 대한 참조는 System.Runtime에 추가되어야 합니다. 직렬화.
DataContractJsonSerializer 직렬화 및 역직렬화 코드 사용:
1: 시스템을 사용합니다.
2: System.Collections.Generic을 사용합니다.
3: 시스템 사용; .Linq;
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(작업 유형(T))
20: MemoryStream milliseconds = new MemoryStream(); 21: ser.WriteObject(MS, T);
22: String 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(작업 유형(T));
33 :MemoryStream milliseconds = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 34: T obj = (T)ser.ReadObject(MS);
35: OBJ 반환;
36:}
37:}
직렬화 데모:
단순 객체 사람:
1: 공개 클래스 사람
2: {
3: 공개 문자열 이름 그룹; 🎜>
4: 공개 해석 연령 {get; group; } 5:} JSON 문자열로 직렬화됨: 1: 잘못된 Page_Load 보호(객체 발신자) , EventArgs 전송됨) 2: { 3: Person p = new Person(); 4: p.Name = "Zhang San"; 5: p.Age = 28; 6: 7: String jsonString = JsonHelper.JsonSerializer <人>(P); 8: 답장 to (jsonString); 9: }출력 결과: {"Era": 28th, "Name": "Zhang San"}직렬화 해제 데모: 1: 잘못된 Page_Load 보호(객체 전송자, EventArgs 전송됨) 2: { 3: String jsonString = "{"age": 28, "이름": "장산"}";4P = JsonHelper.JsonDeserialize <人>(jsonString);
5:}
실행 결과:
ASP.NET JavaScriptSerializer의 JSON 시퀀스도 가능합니다. deserialization 및 deserialization에 사용됩니다. System.Web.Script.Serializatioin 네임스페이스에서 System.Web.Extensions.dll을 참조해야 합니다. JSON.NET도 사용할 수 있습니다.
3. JSON 직렬화 및 역직렬화 날짜 및 시간 처리
JSON 형식은 날짜 및 시간을 직접 지원하지 않습니다. DateTime 값은 "/Date (700000 + 0500)/" 형식으로 표시됩니다. 첫 번째 숫자(제공된 예에서는 700000)가 GMT 시간대의 1970년 1월 1일 자정 이후 일반 시간(일광 절약 시간이 아닌 시간)에서 경과된 밀리초 수인 JSON 문자열입니다. 이전 시간을 나타내기 위해 숫자는 음수일 수 있습니다. "0500"을 포함하는 예제의 선택적 부분은 시간이 현지 유형임을 나타냅니다. 즉, 역직렬화될 때 현지 시간대로 변환되어야 합니다. 해당 부분이 없으면 시간은 UTC로 역직렬화됩니다.
개인 클래스를 수정하고 LastLoginTime을 추가합니다.
1: 공개 클래스 Person
2: {
3: 공개 문자열 이름 그룹;
4: 공개 해석 연령 {get; group;}
5: Public DateTime LastLoginTime {get; group;}
6:}
1 : 사람 p = new 사람();
2: p.Name = "장산"
3: p.Age = 28; LastLoginTime = DateTime.Now;
5:
6: String jsonString = JsonHelper.JsonSerializer <人>(P);
직렬화 결과:
{"Era": 28일, "LastLoginTime": "/Date (1294499956278 + 0800) /", "Name": "Zhang San"}
1. 백그라운드에서 정규식을 사용하여 JsonHelper 수정 표현식 대체 처리:
1: 시스템 사용
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));
21: MemoryStream 밀리초 = new MemoryStream(); 🎜>
22: ser.WriteObject(MS, T); 23: String jsonString = Encoding.UTF8.GetString(ms.ToArray()); 24: ms. Close(); 25: //Json 날짜 문자열 대체 26: 문자열 P = @"\/Date((D+)+D+)\/"; 27: MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); 28: 정규식 장 = new 정규식(P); 29: jsonString = reg.Replace(jsonString, matchEvaluator); 30: jsonString 반환 31: }32: 33: /// <요약> 34 : /// JSON 역직렬화 35: /// 요약> 36: 공개 정적 JsonDeserialize
41: 정규식 장 = 새 정규식 공식(P);
42: jsonString = reg.Replace(jsonString, matchEvaluator)
43: DataContractJsonSerializer SER = new DataContractJsonSerializer(작업 유형(T));
44: MemoryStream milliseconds = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))
45: T obj = (T)ser.ReadObject (MS)
46: OBJ 반환;
47:}
48:
49:/// <요약>
50:/// Will Json 시간/날짜(1294499956278 + 0800)를 문자열로 직렬화함
51:///
52: 비공개 정적 문자열 ConvertJsonDateToDateString( semi )
53: {
54: String result = 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: Result = dt.ToString("YYYY-MM-DD HH:MM:SS");
59: 결과 반환
60: }
61:
62:/// <요약>
63:///시간 문자열을 Json 시간으로 변환
64:/// 요약 >
65: 전용 정적 문자열 ConvertDateStringToJsonDate(saimi)
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");
71: result = String.Format("\/Date({0}+0800)\/",ts.TotalMilliseconds);
72: 결과를 반환합니다. New Person();
2: p.Name = "张三";
3: p.Age = 28
4: p.LastLoginTime = DateTime . Now;
5:
6: String jsonString = JsonHelper.JsonSerializer <人>(P);
실행 결과:
{" Time": 28일, "LastLoginTime": "2011-01-09 1시 분 56초", "Name": "Zhang San"}
역직렬화 데모:
JSON 문자열 = "{"Age": 28일,"LastLoginTime":"2011-01-09 00:30:00","Name":"Zhang San"}";
P + 더 귀찮습니다.
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 날짜 = 새 날짜(parseInt function (jsondate, 10));
11: 반응 월 = date.getMonth() + 1 <10? "0" + (date.getMonth() + 1): date.getMonth() + 1;
12: VAR의 현재 날짜 = date.getDate()<10? "0" + date.getDate(): date.getDate();
13: date.getFullYear()+"-"+month+"-"+currentdate;
14 반환: }
간단한 데모:
ChangeDateFormat("/Date(1294499956278+0800)/");
결과:
4, JSON 시퀀스 처리 및 컬렉션, 사전 및 배열 역직렬화
JSON 데이터에서는 모든 컬렉션, 사전 및 배열이 배열로 표시됩니다.
목록
1: 목록
2: {
3: 새로운 사람 () {name = "Zhang San", 나이 = 28},
4: 새로운 사람 () {name = "Li Si", 나이 = 25}
5 :};
6:
7: String jsonString = JsonHelper.JsonSerializer >(List);
직렬화 결과:
"[{"Age": 28,"Name":"Zhang San"},{"Age": 25,"Name":"lee思"}] ”
사전을 직접 사용할 수 없습니다. JSON의 경우 사전을 JSON으로 변환하는 것은 원래 사전 형식과 일치하지 않습니다. 대신 형식은 사전의 키를 이름 값으로 사용하고 사전의 값을 이름으로 사용합니다. "가치"의 가치. 예:
1: Dictionary
2: dic.Add("Name ", "Zhang San ");
3: dic.Add("Era", "28");
4:
5: String jsonString = JsonHelper .JsonSerializer
직렬화 결과:
1: "[{"key":"name"," value":"张三"},{" 키":"나이","값":"28"}]"