簡體   English   中英

檢查是否可以在Node.js中將值序列化為JSON

[英]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時的情況(例如,如果undefinedfunction或者其他無法正確序列化的東西)。 我該怎么辦?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM