NodeJS -解析JSON(只有字符串或数字)

NodeJS - Parse JSON (only strings or numbers)

本文关键字:字符串 数字 解析 JSON NodeJS      更新时间:2023-09-26

我有点进退两难。我已经在我的应用程序的几个地方,我使用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缺失。

我必须检查每个字段的类型,它是否真的是一个字符串,一个数字,一个数组…或者有没有其他更好的方法?

不幸的是,这是你在使用像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)) { ... }

可以产生更清晰的代码。当你必须在浏览器中使用这些函数时,请确保不要在全局作用域中定义它们。

您必须创建一个小验证器。像这样:

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建议的,您还可以利用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