[英]Check if value can be serialized to JSON in 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時的情況(例如,如果undefined
或function
或者其他無法正確序列化的東西)。 我該怎么辦?
UPD:意外行為的小例子:
evaluate("a.b", {a:{}}, function(s){console.log(s);}); // Logs '{}', but should throw
根據注釋,您可以檢查是否可以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
}));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.