JSON строковые объекты, исключая методы - PullRequest
1 голос
/ 02 сентября 2011

Я работаю над расширением Firefox и пытаюсь структурировать объект JSON.

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

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

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

изображение http://img143.imageshack.us/img143/2603/pictureos.png

1 Ответ

1 голос
/ 02 сентября 2011

Вы можете определить пользовательскую функцию для вашего объекта с именем 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.Это требует от вас явного определения того, что вы хотите и не хотите, но я не думаю, что есть лучший способ.

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

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", если хотите получить только эти типы атрибутов.

...