2015-02-01 6 views
8

ich ohne mit jQuery ein Benutzerskript für Greasemonkey in Firefox erstellen möchten, die alten Text durch neuen Text ersetzen können, wenn die Seite der Webseite geladen wird.Wie kann ich den Text in JSON-String mit einem userscript für Grease ersetzen

HTML-Code:

.. 

window.app = profileBuilder({ 
.. 
    "page": { 
     "btn": { 
      "eye": "blue", 
      "favorite_color": "blue", 
      "gender": "male", 
     }, 
    }, 
.. 
}); 

.. 

Ersetzen "blue" von Auge "grün", "blau" der Lieblingsfarbe von "rot" und "männlich" von "weiblich".

Wenn die Seite geladen wird, ich will sehen, zum Beispiel Green (nicht blau) für Auge und weiblich Geschlecht (nicht männlich).

Ich denke, ich brauche Funktionen nutzen nächste:

GM_getValue() 
GM_setValue() 
JSON.parse() 
JSON.stringify() 

PS: der Code JSON direkt in der Seite und nicht in der Datei (../code.json)

Userscript-Code:

// ==UserScript== 
// @name  nemrod Test 
// @namespace nemrod 
// @include  http*://mywebsite.com/* 
// @version  1 
// ==/UserScript== 
var json = {"page": {"btn": {"eye": "blue","favorite_color": "blue","gender": "male",},},}; 
var stringified = JSON.stringify(json); 
stringified = stringified.replace(/"eye": "blue"/gm, '"eye": "green"'); 
stringified = stringified.replace(/"favorite_color": "blue"/gm, '"favorite_color": "red"'); 
var jsonObject = JSON.parse(stringified); 

Es funktioniert nicht

jemand mit dem richtigen Code helfen?

+0

ist dieser Teil des Skripts oder Seite selbst verantwortlich? –

+0

Was haben Sie ausprobiert und warum müssen Sie diese Funktionen verwenden? – Paul

+0

@vishalsharma Dieser Teil ist auf Seite selbst. – nemrod

Antwort

7

Erste stringify() Ihre JSON.

var stringified = JSON.stringify(json); 

Als nächstes verwenden Sie die .replace() JavaScript String-Funktion.

stringified = stringified.replace('"eye": "blue"', '"eye": "green"'); 
stringified = stringified.replace('"gender": "male"', '"gender": "female"'); 

Jetzt parse() Ihre JSON in ein Objekt.

var jsonObject = JSON.parse(stringified); 

Jetzt können Sie jsonObject für was auch immer Sie wollen.

EDIT: diese Zeilen anstelle der bisherigen .replace() s verwenden.

stringified = stringified.replace('"eye": "blue"', '"eye": "green"'); 
stringified = stringified.replace('"gender": "male"', '"gender": "female"'); 
+0

Kann ich einen Regex verwenden? Wie/"Auge": "(d +)"/g ersetzen "Auge": "grün", denn wenn ich "favorite_color": "blue" habe, können wir 2 mal die gleiche Farbe sehen. – nemrod

+0

Sie könnten, aber ich denke, die '.replace()' String-Funktion ist jetzt einfacher, da es sowieso in JavaScript bereitgestellt wird. Sie können RegEx auch verwenden, wenn Sie möchten. – Data2000

+0

Wie soll ich meinen endgültigen Code erstellen? – nemrod

0

genaueres Verfahren wäre, regulären Ausdruck zu verwenden.

stringified.replace(/"eyes":"blue"/gm, '"eyes":"blue"') 

diese Weise können Sie wissen, dass Sie die blaue für die Augen sind zu ersetzen und nicht blau erscheinen (wie Lieblingsfarbe). die 'g' & 'm' Optionen für reguläre Ausdruck steht für global, was die Suche nach allen zutreffenden Übereinstimmungen (falls Sie mehr als ein 'Augen' in Ihrem json haben) und 'm' für multiline. falls Ihre Zeichenfolge multiline ist.

0

Erste Iteration - JSON.stringify

var json = {"page": {"btn": {"eye": "blue","favorite_color": "blue","gender": "male"}}}; 
 

 
var replaceBy = { 
 
    eye: function(value) { 
 
    if (value == 'blue') { 
 
     return 'green' 
 
    } 
 
    }, 
 
    favorite_color: function(value) { 
 
    if(value == 'blue') { 
 
     return 'red' 
 
    } 
 
    }, 
 
    gender: function(value) { 
 
    if(value == 'male') { 
 
     return 'female' 
 
    } 
 
    } 
 
} 
 

 
console.log(JSON.stringify(json, function(key, value) { 
 
    if(replaceBy[key]) { 
 
    value = replaceBy[key](value) 
 
    } 
 
    return value 
 
}))

Zweite Iteration - nett sein, für ES Harmony

  • Regel hinzufügen - fügt strengen Vergleich
  • Add Matcher - fügt irgendein Funktion, die zum Datenabgleich/ersetzen

'use strict' 
 

 
var json = { 
 
    "page": { 
 
    "btn": { 
 
     "eye": "Blue", 
 
     "favorite_color": "blue", 
 
     "gender": "male" 
 
    } 
 
    } 
 
}; 
 

 
class Replacer { 
 
    constructor() { 
 
    this.matchers = [] 
 
    } 
 

 
    addRule(rule, source, destination) { 
 
    this.matchers.push({ 
 
     type: rule, 
 
     matcher: value => value == source ? destination : value 
 
    }) 
 
    return this 
 
    } 
 

 
    addMatcher(type, matcher) { 
 
    this.matchers.push({ 
 
     type: type, 
 
     matcher: matcher 
 
    }) 
 
    return this 
 
    } 
 

 
    getByType(type) { 
 
    return this.matchers.find(matcher => matcher.type === type) 
 
    } 
 

 
    applyRuleFor(type, value) { 
 
    if (this.getByType(type)) { 
 
     return this.getByType(type).matcher(value) 
 
    } 
 
    } 
 

 
    static replaceWith(replacer) { 
 
    return (key, value) => { 
 
     if (replacer.getByType(key)) { 
 
     value = replacer.applyRuleFor(key, value) 
 
     } 
 
     return value 
 
    } 
 
    } 
 
} 
 

 
console.log(JSON.stringify(json, Replacer.replaceWith(new Replacer() 
 
    .addMatcher('eye', (value) => value.match(/blue/i) ? 'green' : value) 
 
    .addRule('favorite_color', 'blue', 'red') 
 
    .addRule('gender', 'male', 'female'))))

Verwandte Themen