>백엔드 개발 >C#.Net 튜토리얼 >ASP.NET에서 JSON 직렬화 및 역직렬화

ASP.NET에서 JSON 직렬화 및 역직렬화

巴扎黑
巴扎黑원래의
2016-12-20 09:12:561340검색

소개: 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 (T T)

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 (string jsonString)

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 (TT)

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 (문자열 jsonString)

37: {

38: //"YYYY-MM-DD HH:MM:SS" 형식 문자열 변경은 "/Date (1294499956278 + 0800) /" 형식으로 변환됩니다.

39: 문자열 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(작업 유형(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 DIC = New Dictionary

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

3: dic.Add("Era", "28");

4:

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

직렬화 결과:

1: "[{"key":"name"," value":"张三"},{" 키":"나이","값":"28"}]"

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.