Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON对象应答解析_Javascript_Json_Class_Parsing_Object - Fatal编程技术网

Javascript JSON对象应答解析

Javascript JSON对象应答解析,javascript,json,class,parsing,object,Javascript,Json,Class,Parsing,Object,因此,当Ajax调用返回JSON回复时,我会: oData = JSON.parse(sReply); 在哪里 问题是,JSON字符串只包含email和name变量,因此当oData=JSON.parse(sReply)发生时,函数测试会被覆盖,而当我尝试调用函数时,它不存在。有没有办法避免这种情况?我可能有很多函数和其他我不想通过JSON传输的变量。JSON没有编码函数的规定。这只是为了数据 当然,您可以将函数序列化为JavaScript中的字符串,并以类似的方式重新构造它们,但这在其他语言

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

oData = JSON.parse(sReply);
在哪里


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

JSON没有编码函数的规定。这只是为了数据

当然,您可以将函数序列化为JavaScript中的字符串,并以类似的方式重新构造它们,但这在其他语言中效果不太好。(您的Python代码将如何处理JavaScript函数?)


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

JSON没有关于编码函数的规定。这只是为了数据

当然,您可以将函数序列化为JavaScript中的字符串,并以类似的方式重新构造它们,但这在其他语言中效果不太好。(您的Python代码将如何处理JavaScript函数?)

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

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

解决此问题的常用方法是为对象(
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
工厂方法)


作为一个旁注,您应该考虑(即:第一个字符应该是大写的,即:<代码> MyClass <代码>,而不是<代码> MyCase<代码>,正如您将要使用的任何其他函数一样。

< P>一个常见的解决这个问题的方法是提供一个静态的对象(<代码>数据DAT/代码>),它将接受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
工厂方法)


作为一个旁注,你应该考虑(即:第一个字符应该是大写的,即:<代码> MyClass <代码>,而不是<代码> MyCase<代码>,正如你将要使用的任何其他函数一样。

我不想在Python中使用JS代码。oData是一个javascript对象,它使用函数(如test()函数)处理用户数据。我只是使用json来填充objecti的预期变量,我不希望js代码使用python。oData是一个javascript对象,它使用函数(如test()函数)处理用户数据。我只是使用json来填充对象的预期变量。您可以发布json值以及oData对象的预期输出吗?您可以发布json值以及oData对象的预期输出吗?非常感谢!我就是这么做的,解析响应的回复,然后使用oData.init函数分配相应的变量。我原以为我必须将响应声明为oData的简化版本(没有函数),但这是必需的!非常感谢!我就是这么做的,解析响应的回复,然后使用oData.init函数分配相应的变量。我原以为我必须将响应声明为oData的简化版本(没有函数),但这是必需的!非常有趣的方法,谢谢你,尽管这看起来有点过分了。我只做了response=JSON.parse(reply),然后是oData.Email=response.Email(在接受响应变量作为参数的odatainit函数中)是的,这也是一个有效的解决方案——我想说,我的方法受益于将对象构造与业务逻辑分离(即:现在cData的所有实例都带有一个init()方法,它们不需要执行它们的工作)。虽然它是用Java编写的,但进一步阅读这个主题可能会很有趣。非常有趣的方法,谢谢,尽管看起来有点过分。我只做了response=JSON.parse(reply),然后是oData.Email=response.Email(在接受响应变量作为参数的oData init函数中)是的,这也是一个有效的解决方案-我想说,我的方法受益于将对象构造与业务逻辑分离(即:现在所有cData实例都带有一个init()方法,它们不需要执行它们的工作