AngularJS中的格式日期来自大型json数据响应中的$ http.get

时间:2016-07-02 17:21:54

标签: angularjs json

我在Angular控制器中成功调用$ http.get并获取一个大的json对象。像这样:

var self=this;
self.createNewStatusReport = function()
{
    $http.get(self.NewStatusReportUrl).then(function(response)
    {
        self.AngularModel.StatusReportJsons.push(response.data);
    });
};

返回的json包含许多日期。不幸的是,这种格式如下:/ Date(1420099200000)/。这是响应数据的简化部分:

{
    "StatusReportID": 25, 
    "DueDate": "/Date(1468566000000)/", 
    "SubmitDate": null,
    "WorkStatement": [
    {
        "WorkStatementID": 41, 
        "Milestone": [
        {
            "MilestoneID": 501,
            "ContractorComments": null, 
            "Title": "Do some specific piece of work", 
            "StartDate": "/Date(1459494000000)/", 
            "EndDate": "/Date(1469948400000)/", 
            "IsCompleted": false, 
            ...

我也有(某些)控制服务器端,但无法从DateTime更改StatusReportJson中的日期类型?串起来。它是用C#编写的MVC:

[HttpGet]
public JsonResult NewStatusReport(string agreementNumber)
{
    var statusReport = StatusReports.GetStatusReport(25);
    return Json(new StatusReportJson(statusReport), JsonRequestBehavior.AllowGet);
}

是否有一种简单的方法可以将这些日期字符串递归转换为日期对象?我已经解析了响应数据;我可以插入自己的解析步骤吗?在服务器端,我可以将日期作为日期字符串显示为更像“2016-04-01T00:00:00”或简单地“2016-04-01”而不修改我的StatusReportJson对象的数据类型?其他人已经在这里解决了转换问题:How do I format a Microsoft JSON date?我需要帮助构建解决方案的位置,以便在我的情况下有效。谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

希望这可以解决您的问题:

$scope.DateIssue = function(input) {
input = '/Date(1468566000000)/';
$scope.formatedDate = input.toString().replace('/Date(', '').replace(')/', '');
$scope.formatedDate = $filter('date', $scope.formatedDate);
return $scope.formatedDate

};

答案 1 :(得分:0)

这是我如何解决这个问题的。首先,我在服务器端使用了JavaScript序列化程序,如下所示:

[HttpGet]
public JsonResult NewStatusReport(string agreementNumber)
{
    var statusReport = StatusReports.GetStatusReport(25);
    var statusReportJson = new StatusReportJson(statusReport);
    var json = new JavaScriptSerializer().Serialize(statusReportJson);
    return Json(json, JsonRequestBehavior.AllowGet);
}

然后,在客户端,我从这个优秀的页面http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html中提取代码并将其称为:

var self = this;
$http.get(self.NewStatusReportUrl).then(function(response)
{
    var jsonObject = jQuery.parseJSON(response.data, true);
    self.AngularModel.StatusReportJsons.push(jsonObject);
});

感谢Robert Koritnik的回答!感谢所有帮助过的人!

答案 2 :(得分:0)

有点晚了,但我觉得很有帮助。 大多数建议是在本地转换它。在我的例子中,日期以字符串形式返回(带有时区信息)。

E.g。 '2018-06-01T13:57:41.3867449Z'

所以我为getJson&创建了一个公共服务。 PostJson和处理后的回复中有'$ q'。

if (response.data) {
    // Check for datetime object & convert  
    // TODO:: *** May impact performance, so check later or use momentJS
    //console.info('Before-convertDateStringsToDates:', new Date());
    appUtils.convertDateStringsToDates(response.data);
    //console.info('After-convertDateStringsToDates:', new Date());
}

我的appUtil方法如下:

// --------------------------------------------------------------------------------
// Ref: http://aboutcode.net/2013/07/27/json-date-parsing-angularjs.html
// Function to convert string (as ReGex format) property to date - used as generic in Common Serivce.
convertDateStringsToDates(input) {
    // ReGex for format we receive from Web API e.g. "1980-05-09T00:00:00Z"
    var jsonDateTimeFormatRegex = "((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))";
    // Ignore things that aren't objects.
    if (typeof input !== "object") return input;

    for (var key in input) {
        if (!input.hasOwnProperty(key)) continue;

        var value = input[key];
        var match;
        // Check for string properties which look like dates.
        // TODO: Improve this regex to better match ISO 8601 date strings.
        if (typeof value === "string" && (match = value.match(jsonDateTimeFormatRegex))) {
            // Assume that Date.parse can parse ISO 8601 strings, or has been shimmed in older browsers to do so.
            //console.info(match[0]);
            var date = new Date(match[0]); // Need to convert to UTC. Ref: https://stackoverflow.com/a/14006555/1161069
            input[key] = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));

            // var milliseconds = Date.parse(match[0]);
            // if (!isNaN(milliseconds)) {
            //     input[key] = new Date(milliseconds);
            // }
        } else if (typeof value === "object") {
            // Recurse into object
            this.convertDateStringsToDates(value);
        }
    }
}

现在,在每次GET或POST请求之后,我都会获得正确日期的JSON。

万一有人想知道Web API代码,如下所示:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    //var cors = new System.Web.Http.Cors.EnableCorsAttribute("*", "*", "*");
    config.EnableCors(cors);

    // Web API routes
    config.MapHttpAttributeRoutes();

    // other code ......

    var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
    //jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

    JsonSerializerSettings jSettings = new JsonSerializerSettings()
    {
        Formatting = Formatting.None
    };
    jSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    jsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
    jsonFormatter.SerializerSettings = jSettings;

    // rest of the code....
}