NodeJS – parsingJSON(仅string或数字)

我有一点困惑怎么办(我该怎么办)。 我已经在我的应用程序中有几个地方使用AJAX来传输JSON数据。 因此,例如从registry中接收数据:

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.firstNamefields.firstName{} / [] ? 这可能会发生,如果有人发送了一个错误的数据types的修改后的JSON,整个应用程序将崩溃,因为方法xxx丢失。

我必须检查每个字段的types,不pipe它是一个string,一个数字还是一个数组…或者还有其他更好的方法来做到这一点?

不幸的是,这是使用JavaScript等dynamic语言时必须要面对的问题。

一种可能的解决scheme是不使用String方法 ,而是创build一个函数来首先检查它的参数:

 // 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模块中,这应该不成问题。

你将不得不做一个validation。 像那样:

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

除了Tharabas的build议之外,你可以利用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