JSon 날짜 형식 문제 의 네 가지 해결 방법(초 상세)

14109 단어 json날짜.격식.
개발 중 에는 서버 에서 json 형식의 데 이 터 를 되 돌려 야 할 때 가 있 습 니 다.배경 코드 에 DateTime 형식의 데이터 가 있 으 면 시스템 이 자체 적 으로 가지 고 있 는 도구 류 를 직렬 화하 면 긴 숫자 로 날짜 데 이 터 를 표시 합 니 다.다음 과 같 습 니 다.

 //                
 context.Response.ContentType = "text/plain";
 //      
 List<Student> students = new List<Student>
 {
 new Student(){Name ="Tom",
 Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},
 new Student(){Name ="Rose",
 Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
 new Student(){Name ="Mark",
 Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}
 };
 //javascript    
 JavaScriptSerializer jss=new JavaScriptSerializer();
 //           json  
 string studentsJson=jss.Serialize(students);
 //          
 context.Response.Write(studentsJson);
 context.Response.End();
실행 결 과 는:

그 중에서 톰 이 대응 하 는 생일 인'2014-01-31'은 1391141532000 으로 바 뀌 었 는데 이것 은 1970 년 1 월 1 일 부터 지금까지 의 밀리초 이다.1391141532000/1000/60/60/24/365=44.11 년,44+1970=2014 년 에 이런 방법 으로 년 월 일 시 분 초 와 밀리초 를 얻 을 수 있다.이런 격식 은 실행 가능 한 표현 형식 이지 만 일반인 이 이해 할 수 있 는 우호 적 인 격식 이 아 닌 데 어떻게 이 격식 을 변화 시 킬 수 있 습 니까?
해결 방법:
방법 1:서버 에서 날짜 형식 을 Select 방법 이나 LINQ 표현 식 으로 변환 하여 클 라 이언 트 에 보 냅 니 다.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Script.Serialization;
namespace JsonDate1
{
 using System.Linq;
 /// <summary>
 ///    ,   
 /// </summary>
 public class Student
 {
 /// <summary>
 ///   
 /// </summary>
 public String Name { get; set; }
 /// <summary>
 ///   
 /// </summary>
 public DateTime Birthday { get; set; }
 }
 /// <summary>
 ///        json  
 /// </summary>
 public class GetJson : IHttpHandler
 {
 public void ProcessRequest(HttpContext context)
 {
 //                
 context.Response.ContentType = "text/plain";
 //      
 List<Student> students = new List<Student>
 {
 new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},
 new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
 new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}
 };
 //  Select           Birthday           
 //            ,     
 var studentSet =
 students.Select
 (
 p => new { p.Name, Birthday = p.Birthday.ToString("yyyy-mm-dd") }
 ).ToList();
 //javascript    
 JavaScriptSerializer jss = new JavaScriptSerializer();
 //           json  
 string studentsJson = jss.Serialize(studentSet);
 //          
 context.Response.Write(studentsJson);
 context.Response.End();
 }
 public bool IsReusable
 {
 get
 {
 return false;
 }
 }
 }
}
Select 방법 재 투영 대상 집합 은 Birthday 속성 을 새로운 속성 으로 변환 합 니 다.속성 변화 에 주의 한 후 이름 을 바 꿔 야 합 니 다.속성 명 은 같 을 수 있 습 니 다.여기 서 select 방법 을 사용 할 수도 있 고 LINQ 조회 표현 식 을 사용 할 수도 있 으 며 다른 방식 으로 같은 목적 을 달성 할 수도 있 습 니 다.이런 방법 은 집합 중 클 라 이언 트 가 사용 하지 않 는 속성 을 제거 하여 성능 을 간단하게 최적화 하 는 목적 을 달성 할 수 있다.
실행 결과:

이 때 는 날짜 형식 이 우호 적 인 형식 으로 바 뀌 었 지만 자바 script 에 서 는 문자열 일 뿐 입 니 다.
방법 2:
javascript 에서"Birthday":"\/date(1391141532000)\/"의 문자열 을 javascript 의 날짜 대상 으로 변환 합 니 다.Birthday 라 는 Key 에 대응 하 는 Value 의 비 숫자 문 자 를 교체 하 는 방식 으로 삭제 하고 하나의 숫자 1391141532000 까지 삭제 한 다음 Date 대상 을 예화 하여 1391141532000 밀리초 를 매개 변수 로 하여 자바 script 의 날짜 대상 을 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>json      </title>
 <script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
 <script type="text/javascript">
 $(function() {
 $.getJSON("getJson.ashx", function (students) {
 $.each(students, function (index, obj) {
 $("<li/>").html(obj.Name).appendTo("#ulStudents");
 //                 (\D)  
 //               
 var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));
 //           ,  1970   1   1           
 var birthday = new Date(birthdayMilliseconds);
 $("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;
 });
 });
 });
 </script>
</head>
<body>
 <h2>json      </h2>
 <ul id="ulStudents">
 </ul>
</body>
</html>
실행 결과:

위의 사용 정규/\D/igm 은 모든 비 숫자 를 교체 하 는 목적 을 달성 합 니 다.\D 는 비 숫자 를 표시 하고 igm 은 매개 변수 이 며 각각 무시(ignore)대소 문 자 를 표시 합 니 다.여러 번,전역(global)교체;다 중 줄 바 꾸 기(multi-line);때로는+86 의 경우 도 있 고,정규 만 바 꾸 면 목적 을 달성 할 수 있다.또한 프로젝트 에서 날짜 형식 을 처리 해 야 하 는 문제 가 반복 되면 자바 script 방법 을 확장 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.

$(function () {
 $.getJSON("getJson.ashx", function (students) {
 $.each(students, function (index, obj) {
 $("<li/>").html(obj.Name).appendTo("#ulStudents");
 //                 (\D)  
 //               
 var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));
 //           ,  1970   1   1           
 var birthday = new Date(birthdayMilliseconds);
 $("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents");
 $("<li/>").html(obj.Birthday.toDate()).appendTo("#ulStudents");
 });
 });
 });
 // String       toDate  ,        
 String.prototype.toDate = function () {
 var dateMilliseconds;
 if (isNaN(this)) {
 //                 (\D)  
 dateMilliseconds =this.replace(/\D/igm, "");
 } else {
 dateMilliseconds=this;
 }
 //           ,  1970   1   1           
 return new Date(parseInt(dateMilliseconds));
 };
   위 에서 확장 하 는 방법 은 toDate 가 합 리 적 이지 도 않 고 강하 지도 않 아서 필요 에 따라 수정 할 수 있 습 니 다.
방법 3:
제3자 의 json 도구 류 를 선택 할 수 있 습 니 다.그 중에서 날짜 형식 문 제 를 이미 처리 한 것 이 적지 않 습 니 다.흔히 볼 수 있 는 json 직렬 화 와 반 직렬 화 도구 라 이브 러 리 는 다음 과 같 습 니 다.
1.fastJSON.
2.JSON_checker.
3.Jayrock.
4.Json.NET - LINQ to JSON.
5.LitJSON.
6.JSON for .NET.
7.JsonFx.
8.JSONSharp.
9.JsonExSerializer.
10.fluent-json
11.Manatee Json
여기 서 litjson 을 직렬 화 와 반 직렬 화 json 의 도구 류 를 예 로 들 면 코드 는 다음 과 같다.

using System;
using System.Collections.Generic;
using System.Web;
using LitJson;
namespace JsonDate2
{
 using System.Linq;
 /// <summary>
 ///    ,   
 /// </summary>
 public class Student
 {
 /// <summary>
 ///   
 /// </summary>
 public String Name { get; set; }
 /// <summary>
 ///   
 /// </summary>
 public DateTime Birthday { get; set; }
 }
 /// <summary>
 ///        json  
 /// </summary>
 public class GetJson : IHttpHandler
 {
 public void ProcessRequest(HttpContext context)
 {
 //                
 context.Response.ContentType = "text/plain";
 //      
 List<Student> students = new List<Student>
 {
 new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},
 new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
 new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}
 };
 //           json  
 string studentsJson = JsonMapper.ToJson(students);
 //          
 context.Response.Write(studentsJson);
 context.Response.End();
 }
 public bool IsReusable
 {
 get
 {
 return false;
 }
 }
 }
}
실행 결 과 는 다음 과 같 습 니 다.

이때 의 날짜 형식 은 기본적으로 정확 합 니 다.자바 script 에서 날 짜 를 직접 예화 하면 됩 니 다.

var date = new Date("01/31/2014 12:12:12");
alert(date.toLocaleString());
클 라 이언 트 의 코드 는 다음 과 같 습 니 다.

$(function () {
 $.getJSON("GetJson2.ashx", function (students) {
 $.each(students, function (index, obj) {
 $("<li/>").html(obj.Name).appendTo("#ulStudents");
 var birthday = new Date(obj.Birthday);
 $("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents");
 });
 });
 });
 var date = new Date("01/31/2014 12:12:12");
 alert(date.toLocaleString());
방법 4:
이 글 을 블 로그 에 올 린 네티즌 들 은 그들의 소중 한 의견 을 제 기 했 습 니 다.저 는 MVC 의 상황 을 고려 하지 않 았 습 니 다.사실은 MVC 에서 도 handler 를 사용 할 수 있 기 때문에 차이 가 크 지 않 습 니 다.그러나 MVC 에서 서버 응답 을 JSON 으로 하 는 Action 이 있 습 니 다.코드 는 다음 과 같 습 니 다.

using System;
using System.Web.Mvc;
namespace JSONDateMVC.Controllers
{
 public class HomeController : Controller
 {
 public JsonResult GetJson1()
 {
 //            ,      Get  
 return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
 }
 }
}
실행 결과:
Application/json 내용 의 파일 을 다운로드 합 니 다.파일 이름 은 GetJSon 1 이 고 내용 은'\/date(1391418272884)\/'입 니 다.
위의 상황 에서 볼 때 MVC 에서 직렬 화 될 때 날짜 형식 에 대해 특별히 처리 하지 않 았 습 니 다.우 리 는 원본 코드 를 역 컴 파일 할 수 있 습 니 다.
Return 호출 된 JSon 방법:

protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
{
 return this.Json(data, null, null, behavior);
}
this.Json  
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
 return new JsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
}
JSonResult 클래스 ActionResult 클래스 의 하위 클래스,ExecuteResult 방법:

위의 코드 에서 마이크로소프트 의 JSonResult 류 는 여전히 JavaScriptSerializer 를 사용 하고 있 음 을 알 수 있 습 니 다.따라서 돌아 오 는 결 과 는 방법 이 처리 되 지 않 았 을 때 와 같 습 니 다.이 문 제 를 해결 하려 면 우 리 는 새로운 종 류 를 파생 시 켜 Execute Result 방법 을 다시 쓸 수 있 습 니 다.JSon.net 을 사용 하여 직렬 화 작업 을 완성 할 수 있 습 니 다.JSonResultPro.cs 파일 의 코드 는 다음 과 같 습 니 다.

namespace JSONDateMVC.Common
{
 using System;
 using System.Web;
 using System.Web.Mvc;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
 public class JsonResultPro : JsonResult
 {
 public JsonResultPro(){}
 public JsonResultPro(object data, JsonRequestBehavior behavior)
 {
 base.Data = data;
 base.JsonRequestBehavior = behavior;
 this.DateTimeFormat = "yyyy-MM-dd hh:mm:ss";
 }
 public JsonResultPro(object data, String dateTimeFormat)
 {
 base.Data = data;
 base.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 this.DateTimeFormat = dateTimeFormat;
 }
 /// <summary>
 ///     
 /// </summary>
 public string DateTimeFormat{ get; set; }
 public override void ExecuteResult(ControllerContext context)
 {
 if (context == null)
 {
 throw new ArgumentNullException("context");
 }
 if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
 { 
 throw new InvalidOperationException("MvcResources.JsonRequest_GetNotAllowed");
 }
 HttpResponseBase base2 = context.HttpContext.Response;
 if (!string.IsNullOrEmpty(this.ContentType))
 {
 base2.ContentType = this.ContentType;
 }
 else
 {
 base2.ContentType = "application/json";
 }
 if (this.ContentEncoding != null)
 {
 base2.ContentEncoding = this.ContentEncoding;
 }
 if (this.Data != null)
 {
 //  System.DateTime       ISO 8601    
 //ISO 8601 ( 2008-04-12T12:53Z)
 IsoDateTimeConverter isoDateTimeConverter=new IsoDateTimeConverter();
 //      
 isoDateTimeConverter.DateTimeFormat = DateTimeFormat;
 //   
 String jsonResult = JsonConvert.SerializeObject(this.Data,isoDateTimeConverter);
 //    
 base2.Write(jsonResult);
 }
 }
 }
}
위의 JSonResultPro Action 형식의 코드 를 사용 하면 다음 과 같 습 니 다.

 public JsonResultPro GetJson2()
 {
 //            ,      Get  ,  H   
 return new JsonResultPro(DateTime.Now,"yyyy-MM-dd HH:mm");
 }
실행 결과:
"2014-02-03 18:10"
이렇게 하면 완전히 자신의 뜻 대로 날짜 형식 을 설정 할 수 있 지만 평소 Format 과 같은 날짜 형식 은 차이 가 있 습 니 다.예 를 들 어 시간 을 표시 하 는 H 는 대문자 로 24 시간 제 를 표시 하고 소문 자 는 12 시간 제 를 표시 하면 주의 하 셔 야 합 니 다.그리고 몇 가지 더 물 어 볼 게 있 습 니 다.
1.Reflector 역 컴 파일 을 통 해 얻 은 코드 에는 많은 변화 가 있 습 니 다.예 를 들 어 속성 이 get 로 변 합 니 다.Request()방법의 형식 으로 여러분 에 게 더 좋 은 방법 이 있 을 지 모 르 겠 습 니 다.
2.역 컴 파일 된 코드 에서 자원 파일 MvcResources.JSonRequest 을 사 용 했 습 니 다.GetNotAllowed,어떻게 다시 쓸 때 도 사용 할 수 있 습 니까?
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 JSON 날짜 양식 문제 의 네 가지 해결 방법 인 소결(초 상세)입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기