Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查Node.js中的值是否可以序列化为JSON_Javascript_Json_Node.js - Fatal编程技术网

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

Javascript 检查Node.js中的值是否可以序列化为JSON,javascript,json,node.js,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 + ':

我有这个密码:

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}));
    }
}
这里的Callback表示一些函数,它接受编码为字符串格式的任意JSON数据

我想以某种方式处理这种情况,例如,当求值恰好不可序列化为JSON时,如果它是未定义的或函数或其他任何无法正确序列化的内容。我怎么能这样做

UPD:意外行为的小例子:

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

根据注释,您可以检查评估本身是否可以字符串化,或者ti是否返回未定义。如果可以字符串化,则可以使用{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
    }));
  }
}
如果响应更复杂,且数据字段多于此字段,则此解决方案可能更好:

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

您的代码应该按预期工作。你在上面遇到过任何问题吗?@pubudodangoda如果表达式抛出异常或正常计算,我的代码会按预期工作,但当它不抛出但提供了一个无法序列化为JSON的实体时,它只返回{},这在我的情况下是不可接受的。@pubudodangoda我用小示例更新了我的问题是一个完全有效的JSON,因此您需要手动添加额外的检查。@FedericoklezCulloca是的,问题实际上是如何检查JSON.stringify{data:something}是否返回{}或{data:something_encoded}是的,应该可以。在接受这个答案之前,我将等待一个更简单的解决方案。