Javascript JSON对象应答解析
因此,当Ajax调用返回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中的字符串,并以类似的方式重新构造它们,但这在其他语言
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()方法,它们不需要执行它们的工作