10
votes

cscript jscript JSON JSON

C'est un problème étrange très très (très !!!).

J'ai ce jscript qui fonctionne sur Windows XP et 7 à l'aide de DOS cscript dans un fichier appelé testjson. JS . xxx

et, eh bien, le message apparaît, mais est un comportement inattendu de JScript car JSON (comme le MSDN Documentation dit) est l'un des objets par défaut dans le Jscript 5.8 et mon système sous Windows 7 exécute exactement jscript 5.8 .

maintenant, j'ai résolu temporaire ce problème (dans un petit script complexe) en créant un nouveau fichier texte et composition manuelle d'une chaîne JSON valide (et, évidemment, tout cela permet de fonctionner correctement même si le système n'a pas le JScript 5.8 comme demandé pour JSON) mais j'aime connaître deux choses principalement :

1st Pourquoi je ne peux pas utiliser l'objet JSON Même si ma version JScript est celle qui prend en charge cet objet?

2e < / strong> J'ai Lire quelque chose sur "Activation" du JSON ( et autre) objet indisponible dans mon environnement JScript, mais tous les exemples sont pour C # et j'aime savoir si un code équivalent pour JScript existe ou non.


0 commentaires

3 Réponses :


10
votes

Pourquoi je ne peux pas utiliser l'objet JSON même si ma version JScript est celle qui prend en charge cet objet?

Selon MSDN , L'hôte de script Windows utilise la fonction JScript 5.7 définie par défaut pour la compatibilité en arrière. L'ensemble de fonctions JScript 5.8 est utilisé uniquement dans Internet Explorer dans les modes de documents de normes IE8 +.

Vous avez les options suivantes:

  1. Inclure JSON2.JS dans votre script. Voir Cette question pour obtenir des options pour inclure des scripts externes dans les scripts JScript.

  2. modifie le registre à Expose le moteur JScript de IE9 à l'hôte de script Windows . upd: cette solution utilise les DLL JScript de IE, mais n'active pas le jeu de fonctions 5.8.

  3. Créer un hôte d'exécution JScript Programmatiquement à l'aide des interfaces de script actif et utilisez iActivescriptTroperty :: SetProperty Pour forcer le jeu de fonctions JScript 5.8 ( ScriptLanguageVersion_5_8 ). Voici un Exemple C ++ .

    J'ai lu quelque chose à propos de "Activation" du JSON (et d'un autre) objet indisponible dans mon environnement JScript, mais tous les exemples sont pour C # et j'aime savoir si un code équivalent pour JScript existe ou non.

    Les hôtes d'exécution de script personnalisés ne peuvent être créés que en utilisant des langues avec une prise en charge appropriée COM, telle que C ++, C # etc. JScript ne peut pas être utilisée pour cela, car, par exemple, il ne supporte pas les paramètres.


5 commentaires

Malheureux, mais vrai. Pourquoi il n'y a pas de remplacement ni de param sur Wscript / Script ne me dépasse pas.


Wow, que wsh est une blague totale. Merci, Microsoft!


@rojo: Vous devriez ajouter cela comme une réponse.


@Helen Je ne sais pas si vous vous souciez, mais j'ai trouvé une solution de contournement de hacksse que je pensais être assez intelligente. Voir ma réponse modifiée ci-dessous.


Merci d'avoir souligné JSON2.JS; Ce que j'ai fait était de créer un petit fichier .WSF qui incluait que le fichier JavaScript puis incluait mon propre fichier de script. Très bien travaillé!



19
votes

Vous pouvez utiliser eval () code> pour obtenir un effet similaire à json.parse () code>. xxx pré>

et ensuite, obj.tostring () code> vous permettra de récupérer les données similaires à json.stringify () code> (juste sans les options de l'embellissement). Voir cette réponse pour un exemple dans la nature. Le point est que vous pouvez créer un objet de texte JSON sans avoir à charger des bibliothèques externes ni commuter le moteur d'interpréteur. P>

Avertissement gros gras !!! H2>

Ceci introduit une vulnérabilité à le poste de travail exécutant votre code. Si vous ne contrôlez pas la génération du JSON, vous souhaitez analyser, ou s'il est possible qu'un tiers partielle puisse modifier le JSON entre sa génération et son interprétation, alors envisagez de suivre Conseil de Helen . Si de mauvaises choses sont dans le JSON, cela peut causer votre wscript de faire de mauvaises choses. Par exemple, si votre chaîne ou votre fichier JSON contient les éléments suivants: p>

// load htmlfile COM object and declare empty JSON object
var htmlfile = WSH.CreateObject('htmlfile'), JSON;

// force htmlfile to load Chakra engine
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');

// The following statement is an overloaded compound statement, a code golfing trick.
// The "JSON = htmlfile.parentWindow.JSON" statement is executed first, copying the
// htmlfile COM object's JSON object and methods into "JSON" declared above; then
// "htmlfile.close()" ignores its argument and unloads the now unneeded COM object.
htmlfile.close(JSON = htmlfile.parentWindow.JSON);


2 commentaires

Pourquoi avez-vous eu à affecter JSON dans la zone des paramètres? Qu'est-ce qui ne va pas pour faire cette ligne au-dessus de la fermeture?


Je n'ai pas eu à. C'est juste une astuce de golf de code, fourrant une commande comme un argument surchargé dans une méthode qui n'attend aucun argument. 3 lignes de code sont plus impressionnantes que 4. C'est une question de préférence personnelle. Voir cette réponse pour une démonstration d'importation d'autres méthodes de chakra dans Jscript.



0
votes

Encode JSON, décodage sans parseur par défaut: https://gist.github.com/gnh1201/e372f5de2e076dbee205A07EB4064D8D

var $ = {};

/**
 * Decode JSON
 *
 * @param string jsonString - JSON text
 *
 * @return object
 */
$.json.decode = function(jsonString) {
    return (new Function("return " + jsonString)());
};

/**
 * Encode JSON
 *
 * @param object obj - Key/Value object
 *
 * @return string
 */
$.json.encode = function(obj) {
    var items = [];
    var isArray = (function(_obj) {
        try {
            return (_obj instanceof Array);
        } catch (e) {
            return false;
        }
    })(obj);
    var _toString = function(_obj) {
        try {
            if(typeof(_obj) == "object") {
                return $.json.encode(_obj);
            } else {
                var s = String(_obj).replace(/"/g, '\\"');
                if(typeof(_obj) == "number" || typeof(_obj) == "boolean") {
                    return s;
                } else {
                    return '"' + s + '"';
                }
            }
        } catch (e) {
            return "null";
        }
    };

    for(var k in obj) {
        var v = obj[k];

        if(!isArray) {
            items.push('"' + k + '":' + _toString(v));
        } else {
            items.push(_toString(v));
        }
    }

    if(!isArray) {
        return "{" + items.join(",") + "}";
    } else {
        return "[" + items.join(",") + "]";
    }
};

/**
 * Test JSON
 *
 * @param object obj - Key/Value object
 *
 * @return boolean
 */
$.json.test = function(obj) {
    var t1 = obj;
    var t2 = $.json.encode(obj);
    $.echo($.json.encode(t1));

    var t3 = $.json.decode(t2);
    var t4 = $.json.encode(t3);
    $.echo(t4);

    if(t2 == t4) {
        $.echo("success");
        return true;
    } else {
        $.echo("failed");
        return false;
    }
};

/**
 * Echo
 *
 * @param string txt
 *
 * @return void
 */
$.echo = function(txt) {
    if($.isWScript()) {
        WScript.Echo(txt);
    } else {
        try {
            window.alert(txt);
        } catch (e) {
            console.log(txt);
        }
    }
};

/**
 * Check if WScript
 *
 * @return bool
 */
$.isWScript = function() {
    return typeof(WScript) !== "undefined";
}

// test your data
var t1 = {"a": 1, "b": "banana", "c": {"d": 2, "e": 3}, "f": [100, 200, "3 hundreds", {"g": 4}]};
$.json.test(t1);


0 commentaires