JSON对象回复解析

时间:2012-05-22 13:02:30

标签: javascript json class parsing object

因此,当Ajax调用返回JSON回复时,我会这样做:

oData = JSON.parse(sReply);

,其中

var oData = new cData();

function cData() {
    this.Email = "";
    this.Name = "";
    this.test = function () {
        alert("lol");
    }
}

问题是,JSON字符串只包含电子邮件和名称变量,因此当oData = JSON.parse(sReply)发生时,函数测试会被覆盖,当我尝试调用该函数时它不存在。有办法避免这种情况吗?我可能在那里有很多函数和其他我不想通过JSON传输的变量。

3 个答案:

答案 0 :(得分:3)

JSON没有编码功能的规定。它仅适用于数据。

当然,您可以将函数序列化为JavaScript中的字符串,并且同样可以重新构建它们,但这在其他语言中效果不佳。 (你的Python代码用JavaScript函数做什么?)

如果你考虑数据交换的一般问题,特别是涉及来自不完全信任的提供商的服务时,通过数据编码允许函数的想法变得非常可怕。

答案 1 :(得分:3)

oData = JSON.parse(sReply); - 这会创建一个JavaScript对象。如果oData以前是cData对象,则无关紧要......您只需重新分配它。

您应该能够获取JSON响应并手动将其属性分配给现有的cData对象:

var oData = new cData();
var response = JSON.parse(sReply);
oData.Email = response.Email;
oData.Name = response.Name;

或者你可以遍历属性:

for (var i in response)
    oData[i] = response[i];

答案 2 :(得分:2)

解决此问题的常用方法是为您的对象(cData)提供静态factory method,它将接受DTO(Data Transfer Object)并返回新的cData实例,即:

function cData() { 
    this.Email = "";
    this.Name = "";
    this.test = function () {
        alert("lol");
    }
}

// Static factory which produces a new `cData` object from the supplied
// Data Transfer Object.  Note this function belongs to the Constructor
// function rather than instances created when it's used.
cData.fromDTO(value) {
        // Create a new cData instance.
        var result = new cData();

        // Copy the properties from the DTO.
        result.Email = value.Email;
        result.Name = value.Name;

        // Return the populated instance.
        return result;
}

然后,您可以使用静态工厂来处理AJAX调用的结果,即:

function onAjaxResponse(response) {
    var myData = cData.fromDTO(JSON.parse(response));

    // Invoke the 'test' method.
    myData.test();
}

这也提供了数据传输层(来自服务器的数据)和业务逻辑(您的JavaScript应用程序)之间的明确分离;如果您需要更改DTO的属性(例如:Name更改为FirstName),则只需在一个位置修改代码(fromDTO工厂方法)。

作为旁注,你应该考虑making use of BumpyCaps when naming Constructor Functions(即:第一个字符应该是大写字母,即:MyClass而不是myClass,就像你的任何其他函数一样。)< / p>