检查Node.js中是否可以将值序列化为JSON

时间:2018-02-08 09:00:06

标签: javascript json node.js

我有这段代码:

function evaluate(expression, context, callback)
{
    try {
        var evaluated = safeEval(expression, context);
        callback(JSON.stringify({data: evaluated}));
    } catch(err) {
        callback(JSON.stringify({error: err.name + ': ' + err.message}));
    }
}

这里的回调代表一些函数,它接受编码成字符串格式的任意JSON数据。

我想以某种方式处理evaluated恰好可以在JSON中反序列化的情况(例如,如果它是undefinedfunction或其他无法正确序列化的其他内容) 。我怎么能这样做?

UPD:意外行为的小例子:

evaluate("a.b", {a:{}}, function(s){console.log(s);});    // Logs '{}', but should throw

1 个答案:

答案 0 :(得分:1)

根据评论,您可以检查evaluated本身是否可以进行字符串化,或者ti是否会返回undefined。如果可以进行字符串化,则可以使用'{"data":'+stringified+'}'完成json响应的完成。执行此连接是保存,因为stringified将是有效的JSON值。

function evaluate(expression, context, callback) {
  try {
    var evaluated = safeEval(expression, context);
    var stringified = JSON.stringify(evaluated);

    if (typeof stringified === 'undefined') {
      throw new Error('could not be stringified');
    }

    callback('{"data":' + stringified + '}');
  } catch (err) {
    callback(JSON.stringify({
      error: err.name + ': ' + err.message
    }));
  }
}

如果响应更复杂,然后使用data字段,那么此解决方案可能会更好:

function evaluate(expression, context, callback) {
  try {
    var evaluated = safeEval(expression, context);
    var stringified = JSON.stringify({
      data: evaluated
    });

    if (typeof JSON.parse(stringified).data === 'undefined') {
      throw new Error('could not be stringified');
    }

    callback(stringified);
  } catch (err) {
    callback(JSON.stringify({
      error: err.name + ': ' + err.message
    }));
  }
}