كيفية استخدام معلمة json.parse reviver لتحليل سلسلة تاريخ
-
22-09-2019 - |
سؤال
تحتوي سلسلة JSON الخاصة بي على حقل تاريخ يرجع هذه القيمة:
"2009-04-04T22:55:16.0000000-04:00"
أنا مهتم بشكل خاص بتحليل مقصورة التاريخ وليس الوقت. حاولت استخدام وظيفة Reviver ، ولكن من المثير للاهتمام أن وظيفة Reviver لم يتم الاحتجاج بها أبدًا! (حاول على Firefox)
هذا هو الكود الخاص بي لإنجاز ذلك:
var Site = {
.....
dateReviver: function(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
},
loadArticle: function(id) {
....
proxy.getArticle(id, function(response) {
var data = JSON.parse(response.result, Site.dateReviver);
....
});
}
};
json.parse في loadArticle
لا تتصل أبدا dateReviver
.
لقد استثمرت يومًا كاملاً ولكن لا حظ! هل يستطيع أي شخص مساعدتي رجاء؟
المحلول
يتوقع التعبير العادي منطقة زمنية "Zulu" (حرف "Z" في النهاية) ، في حين تعرض سلسلة وقت عينة وقت زمنية رقمية ('-04: 00'). سوف يقبل Regex التالي كلاهما:
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
إذا لم تكن أرقام المنطقة الزمنية صفرًا ، فقد ترغب في تعديل التاريخ بعد تحليل و/أو التحويل إلى UTC ، لاحترام المنطقة الزمنية.
أستطيع أن أرى datereviver () يتم ضرب. جرب ما يلي في المتصفح:
<!-- saved from url=(0014)about:internet --> <html> <head> <script src="http://www.json.org/json2.js"></script> <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script> <script> $(function () { // a mock proxy to return some json to play with var proxy = { getArticle: function(id, foo) { foo({ result: '["2009-04-04T22:55:16.0000000-04:00"]' }); } }; // the origial Site object, with the fixed regex var Site = { dateReviver: function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }, loadArticle: function(id) { proxy.getArticle(id, function(response) { var data = JSON.parse(response.result, Site.dateReviver); // put the parsed JSON date on the page $("#output").html(data[0].toString()); }); } }; // try out our Site object Site.loadArticle(); }); </script> </head> <body> <div id="output"></div> </body> </html>
أحصل على ما يلي في المتصفح ، مما يشير إلى التحليل الناجح:
Sat Apr 4 15:55:16 PDT 2009
نصائح أخرى
باستخدام TypesRipt ، فإن الحل الخاص بي على النحو التالي:
export function parseWithDate(jsonString: string): any {
var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/; // startswith: 2015-04-29T22:06:55
var resultObject = JSON.parse(jsonString,(key: any, value: any) => {
if (typeof value == 'string' && (reDateDetect.exec(value))) {
return new Date(value);
}
return value;
});
return resultObject;
}
أفضل من جميع العوالم ؛-) يستخدم datereviver مجهول ، والذي يتم استدعاؤه بواسطة json.parse على كل خاصية. يتمثل منطق Reviver في التحقق مما إذا كان الخاصية من نوع الخيط وإذا كان الأمر كذلك ، فما إذا كان يبدو بداية تاريخ ... إذا كان تاريخًا ، فدع تاريخًا جديدًا (قيمة) يقوم بالتحليل الفعلي ... يتم دعم اختلافات المنطقة الزمنية بهذه الطريقة.
أتمنى أن يساعد!
تم توسيع نطاق محولات jQuery.Ajax بشكل جيد بالنسبة لي من افتراضيها:
"text json": jQuery.parseJSON
إلى
"text json": function (xmlValue) {
var value = JSON.parse(xmlValue, Site.dateReviver);
return value;
}
استخدام return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
لا يعدل تاريخ معلومات المنطقة الزمنية ، -4:00
في المثال.
البديل هو السماح للتاريخ () القيام بالتحليل لك:
var dateReviver = function (key, value) {
var a;
if (typeof value === 'string') {
a = Date.parse(value);
if (a) {
return new Date(a);
}
}
return value;
}
إذا تم تنسيق JSON مع json.stringify () لكان في UTC (Z).
function dateReviver (k,v) {
var isnum = /^\d+$/.test(v);
// Check if number since Date.parse(number) returns valid date
if (isnum) {
return v;
}
if (Date.parse(v)) {
return new Date(Date.parse(v));
}
return v;
}