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 et, eh bien, le message apparaît, mais est un comportement inattendu de JScript car JSON (comme le MSDN fort> Documentation dit) est l'un des objets par défaut dans le 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 1st strong> Pourquoi je ne peux pas utiliser l'objet JSON Même si ma version JScript est celle qui prend en charge cet objet? p> cscript code> dans un fichier appelé
testjson. JS code>. p>
Jscript 5.8 code> et mon système sous Windows 7 exécute exactement
jscript 5.8 code>. P>
JScript 5.8 code> comme demandé pour JSON) mais j'aime connaître deux choses principalement : P>
3 Réponses :
Pourquoi je ne peux pas utiliser l'objet JSON même si ma version JScript est celle qui prend en charge cet objet? P> blockQuote>
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 +. P>
Vous avez les options suivantes: p>
Inclure JSON2.JS dans votre script. Voir Cette question pour obtenir des options pour inclure des scripts externes dans les scripts JScript. P> LI>
modifie le registre àExpose le moteur JScript de IE9 à l'hôte de script Windows . s> upd: cette solution utilise les DLL JScript de IE, mais n'active pas le jeu de fonctions 5.8. P> LI > 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 code>). Voici un Exemple C ++ . P> LI> ol>
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. P > blockQuote>
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. p>
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 code> 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é!
Vous pouvez utiliser et ensuite, obj.tostring () code> vous permettra de récupérer les données similaires à 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> eval () code> pour obtenir un effet similaire à
json.parse () code>.
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>
// 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);
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.
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);