javascript数组序列化

时间:2016-02-22 17:56:21

标签: javascript json knockout.js

我有这样的代码。主要问题是var jsonOfLog = JSON.stringify(data);提供了正确的JSON "[{"name":"Jhon"},{"name":"Nick"},{"name":"Sanders"}]",但var jsonOfLog = JSON.stringify(test);提供了undefined

为什么呢?这是类型或其他问题?如何解决这个问题?

function AppViewModel() {

    self = this;
    self.items = ko.observableArray();
    self.addItems = function () {
        self.items.push({ Name: 'Test', Date: 'Test', Time: 'Test'});
    }
    function time_format(d) {
        hours = format_two_digits(d.getHours());
        minutes = format_two_digits(d.getMinutes());
        seconds = format_two_digits(d.getSeconds());
        return hours + ":" + minutes + ":" + seconds;
    }
    function format_two_digits(n) {
        return n < 10 ? '0' + n : n;
    }
    self.save = function () {
        data = [{ name: 'Jhon' }, { name: 'Nick' }, { name: 'Sanders' }];
        var test = self.items;
        var jsonOfLog = JSON.stringify(test);

        debugger;
        $.ajax({
            type: 'POST',
            dataType: 'text',
            url: "ConvertLogInfoToXml",
            data: "jsonOfLog=" + jsonOfLog,
            success: function (returnPayload) {
                console && console.log("request succeeded");
            },
            error: function (xhr, ajaxOptions, thrownError) {
                console && console.log("request failed");
            },

            processData: false,
            async: false
        });
    }
    self.capitalizeLastName = function () {
        debugger;

        var date = $("#date").val();


        $.ajax({
            cache: false,

            type: "GET",

            url: "GetByDate",

            data: { "date": date },

            success: function (data) {

                var result = "";

                $.each(data, function (id, item) {
                    var tempDate = new Date();
                    var tempTime = item.Time;
                    debugger;
                    tempDate =new Date(parseInt(item.Date.replace("/Date(", "").replace(")/", ""), 10));
                    self.items.push({ Name: item.Name, Date: (tempDate.getMonth() + 1) + '/' + tempDate .getDate() + '/' + tempDate.getFullYear(), Time: tempTime.Hours });
                });
            },

            error: function (response) {
                debugger;
                alert('eror');
            }
        });

    }
}

ko.applyBindings(new AppViewModel());

2 个答案:

答案 0 :(得分:1)

我在代码中看到了一些可能导致问题的事情。

首先,test变量是对self.items的引用,它是一个Knockout observableArray而不是本机JavaScript数组。我对Knockout不太熟悉,但可能不会将其序列化为数组。

此外,在构造函数的第一行,您将在不使用self的情况下分配给var。这是为全局变量而不是本地变量赋值。如果您的代码中的其他位置有类似的构造,则self引用可能会被覆盖。

答案 1 :(得分:0)

你不能像这样对一个可观察的数组进行字符串化;你最终串起函数而不是数组。你应该使用ko.toJSON(viewModel)函数。

请记住,在KnockOut中,您始终需要使用object.myObservableValue()来访问observable的实际值(而不是object.myObservableValue),否则您最终会使用函数而不是值。< / p>