2011-09-01 12 views
1

Я работаю над расширением Firefox, и я пытаюсь создать объект JSON.JSON строит объекты, исключая методы

Я использую это stringify function, но я получаю эту ошибку:

Could not convert JavaScript argument "NS_ERROR_XPC_BAD_CONVERT_JS"

Я действительно только заботиться о первом уровне или два или свойствах внутри объекта, и я не забочусь о методы/функции. Есть ли более простой способ подстроить объект, если мне это не нужно?

Вот немного кода я использую:

var s=JSONstring.make('abc'); 

    try{ 

     Firebug.Console.log(gContextMenu); 

     s = JSON.stringify(gContextMenu); 

     Firebug.Console.log(s); 
    }catch(e){ 
     Firebug.Console.log('error'); 
     Firebug.Console.log(e); 
    } 
    var s=JSONstring.make('abc'); 
    Firebug.Console.log(s); 
    Firebug.Console.log(gContextMenu); 

Здесь ошибка в окне консоли:

image http://img845.imageshack.us/img845/5554/picture1npb.png

Это то, что я был в состоянии выписывать из Firebug окно консоли:

http://pastebin.com/KPXceRag

Вот скриншот объекта:

image http://img143.imageshack.us/img143/2603/pictureos.png

+0

Пожалуйста, укажите пример строки, которую вы хотите стягивать. Благодарю. –

+0

Действительно ли объект ссылается? – ChaosPandion

+0

@ChaosPandion - возможно, да. Но функция, которую я использовал, должна была иметь дело с рекурсией. Я только копировал/вставлял функцию, но, возможно, ей нужна настройка. Я предполагаю, что JSON.stringify не справляется с этим, или это не всегда доступно? – cwd

ответ

1

можно определить пользовательскую функцию на вашем объекте под названием toJSON(), который возвращает только элементы объекта, который вы хотите. Несколько контр-интуитивно, ваша функция toJSON должна не вернуть строку JSON - она ​​просто возвращает объект, представляющий, что должно использоваться как вход для JSON.stringify.

Например:

// an object with some attributes you want and some you don't 
var o = { 
    a:"value1", 
    b:"value2", 
    doCalc: function() { return this.a + " " + this.b } 
}; 
// define a custom toJSON() method 
o.toJSON = function() { 
    return { 
     a:this.a, 
     calc: this.doCalc() 
    } 
}; 

JSON.stringify(o); // '{"a":"value","calc":"value1 value2"}' 

В вашем случае, вы должны быть в состоянии определить этот метод gContextMenu на лету, перед вызовом JSON.stringify. Это требует от вас четкого определения того, чего вы хотите и чего не хотите, но я не думаю, что есть лучший способ.

Edit: Если вы хотите вывести все значения, не метод, вы можете попробовать что-то вроде этого:

o.toJSON = function() { 
    var attrs = {}; 
    for (var attr in this) { 
     if (typeof this[attr] != "function") { 
      attrs[attr] = String(this[attr]); // force to string 
     } 
    } 
    return attrs; 
}; 

Вы, вероятно, в конечном итоге с несколькими атрибутами, установленными в "[object Object]", но если все, что вы хотите проверить, это, вероятно, не проблема. Вы также можете попробовать проверить typeof this[attr] == "string" || typeof this[attr] == "number", если хотите получить только те типы атрибутов.

+1

Как добавить цикл для возврата всех свойств, но не методов? Или, возможно, все свойства, которые являются строками? Я не знаю, какие предметы будут присутствовать, и пытался их захватить. – cwd

+0

большое спасибо! – cwd