JSon 날짜 형식 문제 의 네 가지 해결 방법(초 상세)
//
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 날짜 양식 문제 의 네 가지 해결 방법 인 소결(초 상세)입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콘텐츠 SaaS | JSON 스키마 양식 빌더Bloomreach Content를 위한 JSON Form Builder 맞춤형 통합을 개발합니다. 최근 Bloomreach Content SaaS는 내장 앱 프레임워크를 사용하여 혁신적인 콘텐츠 유형 필드를 구축할...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.