我有这段代码:
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中反序列化的情况(例如,如果它是undefined
或function
或其他无法正确序列化的其他内容) 。我怎么能这样做?
UPD:意外行为的小例子:
evaluate("a.b", {a:{}}, function(s){console.log(s);}); // Logs '{}', but should throw
答案 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
}));
}
}