NodeJS - 解析JSON(仅限字符串或数字)

时间:2014-05-05 11:18:24

标签: javascript json node.js validation

我有一点困境做什么(我该怎么办)。我在我的应用程序中有几个地方,我使用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.firstNamefields.lastName{} / [],问题是什么?如果有人发送了带有错误数据类型的修改过的JSON,那么可能会发生这种情况,整个应用程序会因为缺少方法xxx而崩溃。

我是否必须检查每个字段的类型是否真的是字符串,数字,数组......还是有另外一种可能更好的方法来执行此操作?

3 个答案:

答案 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