$.parseJSON(data, true) 抛出
$.parseJSON(data, true) throws
我正在 ASP.NET MVC 5 中工作。
我正在尝试以 JSON 格式反序列化来自服务器的日期。 JSON 到达,当我尝试反序列化日期时,调试器只是停止并且不在控制台中显示除控制台之外的任何错误,这是我无法理解的。
到目前为止,这是我的代码:
$(document).ready(function () {
$.ajax({
type: 'GET',
url: '/Home/GetDates',
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (dates) {
var date = dates[0];
var desDate = $.parseJSON(date, true);
console.log(desDate);
}
});
});
这是关于错误消息的一些图片,其中有数据传入。
这是我一直在查看的文档的 link。 Docs
您需要在字符串变量中执行 JavaScript 作为
var dateVar = eval(dates[0]);
这将为您提供日期,但不是您想要的正确格式。对于正确的格式用户 moment.js
或简单地创建您自己的代码行,例如
var finalDate = new Date(dateVar).toISOString().split('T')[0];
console.log(finalDate);
这里再次需要 new Date()
以便我们可以利用 toISOString()
并获得正确的日期格式。
因为你指的是这个 jQuery parseJSON automatic date conversion for Asp.net and ISO date strings 你需要包括那里定义的 jQuery 扩展。
确实,在 jQuery 中,parseJSON(jsonString) 在您使用扩展程序时只接受一个参数。
此外,您的日期变量是一个字符串数组,而不是 json 字符串。
//
// Look at the end....
//
/*
* jQuery.parseJSON() extension (supports ISO & Asp.net date conversion)
*
* Version 1.0 (13 Jan 2011)
*
* Copyright (c) 2011 Robert Koritnik
* Licensed under the terms of the MIT license
* http://www.opensource.org/licenses/mit-license.php
*/
(function ($) {
// JSON RegExp
var rvalidchars = /^[\],:{}\s]*$/;
var rvalidescape = /\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rvalidtokens = /"[^"\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;
var dateISO = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[.,]\d+)?Z/i;
var dateNet = /\/Date\((\d+)(?:-\d+)?\)\//i;
// replacer RegExp
var replaceISO = /"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:[.,](\d+))?Z"/i;
var replaceNet = /"\\/Date\((\d+)(?:-\d+)?\)\\/"/i;
// determine JSON native support
var nativeJSON = (window.JSON && window.JSON.parse) ? true : false;
var extendedJSON = nativeJSON && window.JSON.parse('{"x":9}', function (k, v) {
return "Y";
}) === "Y";
var jsonDateConverter = function (key, value) {
if (typeof(value) === "string") {
if (dateISO.test(value)) {
return new Date(value);
}
if (dateNet.test(value)) {
return new Date(parseInt(dateNet.exec(value)[1], 10));
}
}
return value;
};
$.extend({
parseJSON: function (data, convertDates) {
/// <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>
/// <param name="data" type="String">The JSON string to parse.</param>
/// <param name="convertDates" optional="true" type="Boolean">Set to true when you want ISO/Asp.net dates to be auto-converted to dates.</param>
if (typeof data !== "string" || !data) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = $.trim(data);
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (rvalidchars.test(data
.replace(rvalidescape, "@")
.replace(rvalidtokens, "]")
.replace(rvalidbraces, ""))) {
// Try to use the native JSON parser
if (extendedJSON || (nativeJSON && convertDates !== true)) {
return window.JSON.parse(data, convertDates === true ? jsonDateConverter : undefined);
}
else {
data = convertDates === true ?
data.replace(replaceISO, "new Date(parseInt('',10),parseInt('',10)-1,parseInt('',10),parseInt('',10),parseInt('',10),parseInt('',10),(function(s){return parseInt(s,10)||0;})(''))")
.replace(replaceNet, "new Date()") :
data;
return (new Function("return " + data))();
}
} else {
$.error("Invalid JSON: " + data);
}
}
});
})(jQuery);
var date = '{"date": "\/Date(1498435200000)\/"}';
var desDate = $.parseJSON(date, true);
console.log(desDate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
从ajax调用返回的数据已经被解析,所以dates
是一个包含字符串的数组,dates[0]
是字符串/Date(14984....)/
等
要解析字符串,请删除除数字以外的所有内容,并使用该时间戳创建日期对象。
$(document).ready(function () {
$.ajax({
type : 'GET',
url : '/Home/GetDates',
dataType : "json",
contentType : "application/json; charset=utf-8",
success: function (dates) {
var d = dates[0];
var unix = +d.replace(/\D/g, '');
var date = new Date(unix);
var desDate = date.getFullYear() + '/' +
(date.getMonth()+1) + '/' +
date.getDate();
console.log(desDate);
}
});
});
我正在 ASP.NET MVC 5 中工作。 我正在尝试以 JSON 格式反序列化来自服务器的日期。 JSON 到达,当我尝试反序列化日期时,调试器只是停止并且不在控制台中显示除控制台之外的任何错误,这是我无法理解的。 到目前为止,这是我的代码:
$(document).ready(function () {
$.ajax({
type: 'GET',
url: '/Home/GetDates',
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (dates) {
var date = dates[0];
var desDate = $.parseJSON(date, true);
console.log(desDate);
}
});
});
这是关于错误消息的一些图片,其中有数据传入。
这是我一直在查看的文档的 link。 Docs
您需要在字符串变量中执行 JavaScript 作为
var dateVar = eval(dates[0]);
这将为您提供日期,但不是您想要的正确格式。对于正确的格式用户 moment.js
或简单地创建您自己的代码行,例如
var finalDate = new Date(dateVar).toISOString().split('T')[0];
console.log(finalDate);
这里再次需要 new Date()
以便我们可以利用 toISOString()
并获得正确的日期格式。
因为你指的是这个 jQuery parseJSON automatic date conversion for Asp.net and ISO date strings 你需要包括那里定义的 jQuery 扩展。
确实,在 jQuery 中,parseJSON(jsonString) 在您使用扩展程序时只接受一个参数。
此外,您的日期变量是一个字符串数组,而不是 json 字符串。
//
// Look at the end....
//
/*
* jQuery.parseJSON() extension (supports ISO & Asp.net date conversion)
*
* Version 1.0 (13 Jan 2011)
*
* Copyright (c) 2011 Robert Koritnik
* Licensed under the terms of the MIT license
* http://www.opensource.org/licenses/mit-license.php
*/
(function ($) {
// JSON RegExp
var rvalidchars = /^[\],:{}\s]*$/;
var rvalidescape = /\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rvalidtokens = /"[^"\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;
var dateISO = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[.,]\d+)?Z/i;
var dateNet = /\/Date\((\d+)(?:-\d+)?\)\//i;
// replacer RegExp
var replaceISO = /"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:[.,](\d+))?Z"/i;
var replaceNet = /"\\/Date\((\d+)(?:-\d+)?\)\\/"/i;
// determine JSON native support
var nativeJSON = (window.JSON && window.JSON.parse) ? true : false;
var extendedJSON = nativeJSON && window.JSON.parse('{"x":9}', function (k, v) {
return "Y";
}) === "Y";
var jsonDateConverter = function (key, value) {
if (typeof(value) === "string") {
if (dateISO.test(value)) {
return new Date(value);
}
if (dateNet.test(value)) {
return new Date(parseInt(dateNet.exec(value)[1], 10));
}
}
return value;
};
$.extend({
parseJSON: function (data, convertDates) {
/// <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>
/// <param name="data" type="String">The JSON string to parse.</param>
/// <param name="convertDates" optional="true" type="Boolean">Set to true when you want ISO/Asp.net dates to be auto-converted to dates.</param>
if (typeof data !== "string" || !data) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = $.trim(data);
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (rvalidchars.test(data
.replace(rvalidescape, "@")
.replace(rvalidtokens, "]")
.replace(rvalidbraces, ""))) {
// Try to use the native JSON parser
if (extendedJSON || (nativeJSON && convertDates !== true)) {
return window.JSON.parse(data, convertDates === true ? jsonDateConverter : undefined);
}
else {
data = convertDates === true ?
data.replace(replaceISO, "new Date(parseInt('',10),parseInt('',10)-1,parseInt('',10),parseInt('',10),parseInt('',10),parseInt('',10),(function(s){return parseInt(s,10)||0;})(''))")
.replace(replaceNet, "new Date()") :
data;
return (new Function("return " + data))();
}
} else {
$.error("Invalid JSON: " + data);
}
}
});
})(jQuery);
var date = '{"date": "\/Date(1498435200000)\/"}';
var desDate = $.parseJSON(date, true);
console.log(desDate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
从ajax调用返回的数据已经被解析,所以dates
是一个包含字符串的数组,dates[0]
是字符串/Date(14984....)/
等
要解析字符串,请删除除数字以外的所有内容,并使用该时间戳创建日期对象。
$(document).ready(function () {
$.ajax({
type : 'GET',
url : '/Home/GetDates',
dataType : "json",
contentType : "application/json; charset=utf-8",
success: function (dates) {
var d = dates[0];
var unix = +d.replace(/\D/g, '');
var date = new Date(unix);
var desDate = date.getFullYear() + '/' +
(date.getMonth()+1) + '/' +
date.getDate();
console.log(desDate);
}
});
});