ASPNET 에서 JSON 의 서열 화 와 반 서열 화 방법

JSON 소개
 JSON(JavaScript Object Notation,JavaScript 대상 표현법)은 경량급 데이터 교환 형식 이다.
JSON 은'명 치 쌍'의 집합 이다.구 조 는 대괄호'{}',중 괄호'[]',쉼표',',사칭':',작은 따옴표'''로 구성 되 어 있 으 며,포 함 된 데이터 형식 은 Object,Number,Boolean,String,Array,NULL 등 이 있 습 니 다.
JSON 은 다음 과 같은 형식 을 가지 고 있 습 니 다.
대상(Object)은 무질서 한"이름 값 쌍"집합 입 니 다.한 대상 은"{"로 시작 합 니 다."}"로 끝 납 니 다."이름"마다 하나씩 따라 갑 니 다."여러 개의"이름 값 쌍"은 쉼표 로 구 분 됩 니 다.예:

var user={"name":"  ","gender":" ","birthday":"1980-8-8"}
배열(Array)은 값 의 질서 있 는 집합 입 니 다.한 배열 은'['로 시작 하여']'로 끝나 고 값 사이 에','로 구 분 됩 니 다.예:

var userlist=[{"user":{"name":" ","gender":" ","birthday":"1980-8-8"}},{"user":{"name":" ","gender":" ","birthday":"1985-5-8"}}];
 문자열(String)은 두 따옴표 로 둘러싸 인 임의의 유 니 코드 문자 의 집합 으로 반사 선 전 의 를 사용 합 니 다.
2.JSON 데이터 에 대해 직렬 화 와 반 직렬 화
DataContractJSonSerializer 클래스 를 사용 하여 형식 인 스 턴 스 를 JSON 문자열 로 정렬 하고 JSON 문자열 을 형식 인 스 턴 스 로 역 정렬 할 수 있 습 니 다.DataContractJSonSerializer 는 SystemRuntime SerializationJSon 네 임 스페이스 에서 NET Framework 5 는 SystemServiceModelWebdll 에 포함 되 어 있 으 며 인용 을 추가 해 야 합 니 다.NET Framework 4 는 SystemRuntime Serialization 에 있 습 니 다.
DataContractJSonSerializer 직렬 화 와 반 직렬 화 된 코드 를 이용 합 니 다.

using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemWeb;
using SystemRuntimeSerializationJson;
using SystemIO;
using SystemText;
 /// <summary>
 /// JSON           
/// </summary>
 public class JsonHelper
{
  /// <summary>
  /// JSON   
  /// </summary>
  public static string JsonSerializer<T>(T t)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream();
   serWriteObject(ms, t);
   string jsonString = EncodingUTFGetString(msToArray());
   msClose();
   return jsonString;
  } 
  /// <summary>
  /// JSON    
  /// </summary>
  public static T JsonDeserialize<T>(string jsonString)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
   T obj = (T)serReadObject(ms);
   return obj;
  }
 }
직렬 화 데모:
단순 대상 Person:

  public class Person
 {
  public string Name { get; set; }
  public int Age { get; set; }
 }
JSON 문자열 로 정렬:

 protected void Page_Load(object sender, EventArgs e)
{
 Person p = new Person();
 pName = "  ";
  pAge = 28; 
 string jsonString = JsonHelperJsonSerializer<Person>(p);
  ResponseWrite(jsonString);
 }
출력 결과:

{"Age":28,"Name":"  "} 
역 직렬 화 데모:

  protected void Page_Load(object sender, EventArgs e)
{
  string jsonString = "{\"Age\":28,\"Name\":\"  \"}";
  Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
}
실행 결과:

ASP.NET 의 JSON 직렬 화 와 반 직렬 화 는 JavaScriptSerializer 도 사용 할 수 있 습 니 다.System.Web.script.Serializatioin 네 임 스페이스 에서 System.Web.Extensions.dll 을 참조 하 셔 야 합 니 다.JSON.NET 도 사용 하 실 수 있 습 니 다.
3.JSON 직렬 화 와 반 직렬 화 날짜 시간의 처리
JSON 형식 은 날짜 와 시간 을 직접 지원 하지 않 습 니 다.DateTime 값 은'/Date(700000+0500)/'형식의 JSON 문자열 로 표 시 됩 니 다.이 중 첫 번 째 숫자(제 공 된 예제 에서 700000)는 GMT 시간 대 에서 1970 년 1 월 1 일 자정 이후 정상 시간(비 여름 시간)으로 지 나 는 밀리초 입 니 다.이 숫자 는 이전의 시간 을 나타 내기 위해 마이너스 일 수 있다.예 를 들 어'+0500'부분 을 선택 할 수 있 습 니 다.이 시간 은 Local 형식 에 속 하 는 것 을 표시 합 니 다.즉,역 직렬 화 할 때 로 컬 시간 대 로 전환 해 야 합 니 다.이 부분 이 없 으 면 시간 을 거꾸로 Utc 로 정렬 합 니 다.
Person 클래스 수정,LastLoginTime 추가:

  public class Person
 {
 public string Name { get; set; }
  public int Age { get; set; }
  public DateTime LastLoginTime { get; set; }
 }

 Person p = new Person();
 p.Name = "  ";
 p.Age = 28;
 p.LastLoginTime = DateTime.Now; 
 string jsonString = JsonHelper.JsonSerializer<Person>(p);
직렬 화 결과:

{"Age":28,"LastLoginTime":"\/Date(1294499956278+0800)\/","Name":"  "}
1.배경 에서 정규 표현 식 을 사용 하여 교체 처리 합 니 다.JSonHelper 수정:

  using System;
 using SystemCollectionsGeneric;
 using SystemLinq;
 using SystemWeb;
 using SystemRuntimeSerializationJson;
 using SystemIO;
 using SystemText;
 using SystemTextRegularExpressions;
  
 /// <summary>
 /// JSON           
 /// </summary>
 public class JsonHelper
 {
  /// <summary>
  /// JSON   
  /// </summary>
  public static string JsonSerializer<T>(T t)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream();
   serWriteObject(ms, t);
   string jsonString = EncodingUTFGetString(msToArray());
   msClose();
   //  Json Date   
   string p = @"\\/Date\((\d+)\+\d+\)\\/";
   MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
   Regex reg = new Regex(p);
   jsonString = regReplace(jsonString, matchEvaluator);
   return jsonString;
  }
 
  /// <summary>
  /// JSON    
  /// </summary>
  public static T JsonDeserialize<T>(string jsonString)
  {
   // "yyyy-MM-dd HHmmss"        "\/Date(1294499956278+0800)\/"  
   string p = @"\d{4}-\d{2}-\d{2}\s\d{2}\d{2}\d{2}";
   MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
   Regex reg = new Regex(p);
   jsonString = regReplace(jsonString, matchEvaluator);
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
   T obj = (T)serReadObject(ms);
   return obj;
  }
 
  /// <summary>
  ///  Json       /Date(1294499956278+0800)     
  /// </summary>
  private static string ConvertJsonDateToDateString(Match m)
  {
   string result = stringEmpty;
   DateTime dt = new DateTime(1970,1,1);
   dt = dtAddMilliseconds(longParse(mGroups[1]Value));
   dt = dtToLocalTime();
   result = dtToString("yyyy-MM-dd HHmmss");
   return result;
  }
 
  /// <summary>
  ///         Json  
  /// </summary>
  private static string ConvertDateStringToJsonDate(Match m)
  {
   string result = stringEmpty;
   DateTime dt = DateTimeParse(mGroups[0]Value);
   dt = dtToUniversalTime();
   TimeSpan ts = dt - DateTimeParse("1970-01-01");
   result = stringFormat("\\/Date({0}+0800)\\/",tsTotalMilliseconds);
   return result;
  }
 }
직렬 화 데모:

  Person p = new Person();
 p.Name = "  ";
 p.Age = 28;
 p.LastLoginTime = DateTime.Now; 
 string jsonString = JsonHelper.JsonSerializer<Person>(p);
 실행 결과:

{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"  "}
역 직렬 화 데모:

string json = "{\"Age\":28,\"LastLoginTime\":\"2011-01-09 00:30:00\",\"Name\":\"  \"}";
p=JsonHelper.JsonDeserialize<Person>(json);
실행 결과:

배경 에서 문자열 을 바 꾸 는 것 은 적용 범위 가 좁 아 글로벌 화 된 다양한 언어 를 고려 하면 더욱 번 거 로 울 수 있다.
2.JavaScript 로 처리   

 function ChangeDateFormat(jsondate) {
  jsondate = jsondate.replace("/Date(", "").replace(")/", "");
  if (jsondate.indexOf("+") > 0) {
   jsondate = jsondate.substring(0, jsondate.indexOf("+"));
  }
  else if (jsondate.indexOf("-") > 0) {
   jsondate = jsondate.substring(0, jsondate.indexOf("-"));
  }
  
  var date = new Date(parseInt(jsondate, 10));
  var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) date.getMonth() + 1;
  var currentDate = date.getDate() < 10 ? "0" + date.getDate() date.getDate();
  return date.getFullYear() + "-" + month + "-" + currentDate;
 }
 간단 한 데모:
ChangeDateFormat("\/Date(1294499956278+0800)\/");
결과:
2011-1-8
4.JSON 직렬 화 와 반 직렬 화 집합,사전,배열 의 처리
 JSON 데이터 에서 모든 집합,사전,배열 은 배열 로 표시 된다.
List서열 화:

  List<Person> list = new List<Person>()
 {
  new Person(){ Name="  ", Age=28},
  new Person(){ Name="  ", Age=25}
 };
string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);
직렬 화 결과:

"[{\"Age\":28,\"Name\":\"  \"},{\"Age\":25,\"Name\":\"  \"}]"
사전 은 JSON 에 직접 사용 할 수 없 으 며,Dictionary 사전 이 JSON 으로 전 환 된 것 은 원래 의 사전 형식 과 일치 하 는 것 이 아니 라 형식 은 Dictionary 의 Key 를 명칭'Key'의 값 으로 하고,Dictionary 의 Value 를 명칭'Value'의 값 으로 한다.예:

  Dictionary<string, string> dic = new Dictionary<string, string>();
 dic.Add("Name", "  ");
 dic.Add("Age", "28");
 string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);
직렬 화 결과:

 "[{\"Key\":\"Name\",\"Value\":\"  \"},{\"Key\":\"Age\",\"Value\":\"28\"}]"
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기