我有一点困境做什么(我该怎么办)。我在我的应用程序中有几个地方,我使用AJAX传输JSON数据。例如,从注册表中接收数据:
try {
var data = JSON.parse(json);
}
catch(e) {
// ...
}
var fields = {
firstName: data.firstName || "",
lastName: data.lastName || "",
...
};
然后我需要对这些领域做点什么。让我们说:
if (fields.firstName) {
// OK save it to the DB
}
if(fields.lastName.xxx()) { // xxx() is a method that belongs to JS String Object
// Do something...
}
如果fields.firstName
或fields.lastName
为{}
/ []
,问题是什么?如果有人发送了带有错误数据类型的修改过的JSON,那么可能会发生这种情况,整个应用程序会因为缺少方法xxx
而崩溃。
我是否必须检查每个字段的类型是否真的是字符串,数字,数组......还是有另外一种可能更好的方法来执行此操作?
答案 0 :(得分:2)
不幸的是,使用动态语言(如JavaScript),您将不得不面对这个问题。
一种可能的解决方案是不使用String方法,而是创建一个首先检查它的参数的函数:
// original, with string methods
if (text instanceof String && text.trim().length === 0) { ... }
// alternative, define function first
var isEmptyString = function(text) {
if (!(text instanceof String)) throw new Error("Argument must be a String");
return text.trim().length === 0;
}
// use it in your code
if (isEmptyString(text)) { ... }
这可以使代码更清晰。 当您必须在浏览器中使用它们时,请确保不要在全局范围内定义这些函数。在node.js模块中应该不是问题。
答案 1 :(得分:0)
你必须做一个小验证器。像那样:
var format = {
foo: "string",
bar: "string"
};
var data = {
foo: "bar",
bar: []
}
var validate = function (data, format) {
for(var d in data) {
if(typeof data[d] !== format[d])
return false;
}
return true;
}
console.log(validate(data, format));
你也可以删除这样的无效数据:
var format = {
foo: "string",
bar: "string"
};
var data = {
foo: "bar",
bar: []
}
var validate = function (data, format) {
for(var d in data) {
if(typeof data[d] !== format[d])
delete data[d];
}
return data;
}
console.log(validate(data, format));
答案 2 :(得分:0)
除了Tharabas建议的内容之外,您还可以利用JSON.parse
的第二个参数来进行理智检查:
JSON.parse(data, function(key, value) {
return key === 'firstName' ? cleanup(value) : '';
});
有关详细信息,请参阅此页:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse