JSON 직렬 화 와 역 직렬 화 날짜 시간 처리

5218 단어
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(p);
직렬 화 결과:
{"Age":28,"LastLoginTime":"//Date(1294499956278+0800)//","Name":"  "}

     1. 배경 에서 정규 표현 식 을 사용 하여 교체 처리 합 니 다.JSonHelper 수정:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.Serialization.Json; using System.IO; using System.Text; using System.Text.RegularExpressions; /// /// JSON 직렬 화 및 역 직렬 화 보조 클래스 / / public class JSonHelper {/ / / / JSON 직렬 화 / / public static string JSonSerializer (T t) {DataContractJSonSerializer ser = new DataContractJSonSerializer (typeof (T)); Memory Stream ms = new Memory Stream (); ser. Write Object (ms, t); string jsonString = Encoding. UTF8. GetString (ms. ToArray (); ms. Close (); / / JSon 의 Date 문자열 string p = @ "/ / Date / (/ d +) / + / d + /) / / /"; / * / / / Date / ([/ + / -] / d +) | (/ d +) [/ + /] / d + /) / / / / / * / MatchEvaluator matchEvaluator = new MatchEvaluator (ConvertJSonDateToDateString); Regex reg = new Regex (p); jsonString = reg. Replace (jsonString, matchEvaluator); return jsonString;}/ / / / / / / / / JSON 역 직렬 화 / / public static T JsonDeserialize (string jsonString) {/ / / / "yyy - MM - ddHHH: mm: ss" 형식의 문자열 을 "/ / date (1294499956278 + 0800) / /" 형식의 string p = @ "/ {4} - / {2} - / {2} - / {2} / / {2} / / {2} / / / {2}: / / {2}: / {2}: / {2}: / {2}: / {2}: / {2}: / {2}: / {2}: / {2}: / {{2}}: / {{2}}: / {2}: / {2}: / / {2}}}}; MatMatex (p); jsonString = reg. Replace (jsonString, matchEvaluator); DataContractJSonSerializer ser = new DataContractJSonSerializer (typeof (T)); Memory Streams = new Memory Stream (Encoding. UTF8. GetBytes (jsonString)); T obj = (T) ser. ReadObject (ms); return obj;} / / / / / / / / / / / Json 을 직렬 화 하 는 시간 은 / date (1294499956278 + 0800)문자열 / / private static string ConvertJSonDateToDateString (Match m) {string result = string. Empty; DateTime dt = new DateTime (1970, 1, 1); dt = dt. AddMilliseconds (long. Parse (m. Groups [1]. Value)); dt = dt. ToLocalTime (); result = dt. ToString ("yy - MM - dd HH: mm: ss"); return result;}/ / / / / 시간 문자열 을 JSon 시간 / / private static string 으로 변환 DateStringToJSonDate (Match m) {string result = string. Empty; DateTime dt = DateTime. Parse (m. Groups [0]. Value); dt = dt. ToUniversalTime (); TimeSpan ts = dt - DateTime. Parse ("1970 - 01 - 01"); result = string. Format ("/ / / / Date ({0} + 0800) / /", ts. TotalMilliseconds); return result; } }
 직렬 화 데모:
Person p = new Person(); p. Name = "장삼";p.Age = 28; p.LastLoginTime = DateTime.Now; string jsonString = JsonHelper.JsonSerializer(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(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

좋은 웹페이지 즐겨찾기