JSON 对象回复解析

JSON object reply parsing

本文关键字:回复 对象 JSON      更新时间:2023-09-26

所以当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 传输的变量。

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];

JSON 没有编码函数的规定。它仅用于数据。

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

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

解决此问题的常用方法是为您的对象(cData(提供一个静态工厂方法,该方法将接受 DTO(数据传输对象(并返回一个新的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工厂方法(。

作为旁注,在命名构造函数时,您应该考虑使用 BumpyCaps(即:第一个字符应该是大写的,即:MyClass而不是像任何其他函数那样myClass(。