programing

클라이언트 측 AJAX JSON 날짜의 역직렬화

javamemo 2023. 4. 5. 21:13
반응형

클라이언트 측 AJAX JSON 날짜의 역직렬화

다음 JSON 날짜를 나타냅니다.

"\/Date(1221644506800-0700)\/"

이를 JavaScript Date-type 폼으로 역직렬화하려면 어떻게 해야 합니까?

아래와 같이 MS AJAX JavaScrioptSerializer를 사용해 보았습니다.

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

하지만 돌아오는 것은 문자 그대로의 문자열 날짜뿐입니다.

문자열이 확실히 날짜라는 것을 알고 있다면, 이 작업을 수행하는 것이 좋습니다.

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))

ASP에서 일했던 Bertrand LeRoy 씨NET Atlas/AJAX는 JavaScriptSerializer DateTime 출력의 설계를 설명하고 알 수 없는 선행 슬래시와 후행 슬래시의 기원을 밝혔습니다.그는 다음과 같이 권고했다.

"\/Date(\d+)"\/"에 대한 단순 검색을 실행하고 평가 전에 "new Date($1)"로 대체합니다(단, 검증 후).

저는 그것을 다음과 같이 구현했습니다.

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

이는 다른 많은 답변과 매우 유사합니다.

  • Sjoerd Visscher와 마찬가지로 고정된 RegEx를 사용합니다.^와 $를 잊지 마십시오.
  • string.replace 및 RegEx의 "/Date(1271389496563)/Date(1271389496563)/" 옵션은 전혀 작동하지 않습니다.

JSON 값은 문자열, 숫자, 개체, 배열, true, false 또는 null입니다.그러니까 이건 그냥 끈이에요.날짜를 JSON으로 표시하는 공식 방법은 없습니다.이 구문은 asp.net ajax 구현에서 가져온 것입니다.ISO 8601 형식을 사용하는 사람도 있습니다.

다음과 같이 해석할 수 있습니다.

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);

ASP.net AJAX deserialize 메서드에서 사용되는 정규 표현에서는 "/Date(1234)/"와 같은 문자열이 검색됩니다(문자열 자체에는 따옴표와 슬래시가 포함되어 있어야 합니다.이러한 문자열을 얻으려면 따옴표와 백슬래시 문자를 이스케이프해야 합니다.따라서 문자열을 작성하기 위한 자바스크립트 코드는 "\/Date(1234)\/\"와 같습니다.

이거면 될 거야.

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

좀 이상하긴 한데, 날짜를 연재하고, 거기서 돌아온 문자열을 연재하고, 클라이언트 측에서 한 번 역직렬화해야 한다는 걸 깨달았어요.

이런 거.

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);

Microsoft Ajax 를 사용하고 싶지 않은 경우는, 문자열 클래스에 시제품 함수를 추가하는 것만으로 끝납니다.

예.

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

eval을 사용하지 않으시겠습니까?다음과 같은 간단한 것을 시도해 보십시오.

var date = new Date(parseInt(jsonDate.substr(6)));

덧붙여서, 나는 마이크로소프트가 이 포맷을 사용함으로써 오해를 살 수 있다고 생각하곤 했다.그러나 JSON에서 날짜를 기술하는 방법을 정의할 때는 JSON 규격이 명확하지 않습니다.

실제로 memantjs는 이러한 형식을 지원하므로 다음과 같은 작업을 수행할 수 있습니다.

    var momentValue = moment(value);

    momentValue.toDate();

값을 javascript 날짜 형식으로 반환합니다.

큰 숫자는 표준 JS 시간입니다.

new Date(1221644506800)

2008년 9월 17일 (수) 19:41:46 GMT+1000 (EST)

언급URL : https://stackoverflow.com/questions/82058/deserializing-client-side-ajax-json-dates

반응형