webentwicklung-frage-antwort-db.com.de

Wie kann ich den Text in der JSON-Zeichenfolge durch ein Userscript für Greasemonkey ersetzen?

Ich möchte ein Benutzerskript für Greasemonkey in Firefox erstellen, ohne jQuery zu verwenden, das alten Text durch neuen Text ersetzen kann, wenn die Seite der Website geladen wird.

HTML Quelltext:

..

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

..

Ersetzen Sie "blau" des Auges durch "grün", "blau" der Lieblingsfarbe durch "rot" und "männlich" durch "weiblich".

Wenn die Seite geladen wird, möchte ich beispielsweise grün (nicht blau) für Auge und weiblich für Geschlecht (nicht männlich) sehen.

Ich denke, ich muss als nächstes Funktionen verwenden:

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

PS: Der Code JSON ist direkt auf 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

Kann jemand mit dem richtigen Code helfen?

9
nemrod

Zuerst stringify() dein JSON.

var stringified = JSON.stringify(json);

Verwenden Sie anschließend die Funktion .replace() JavaScript String.

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

Jetzt parse() dein JSON in ein Objekt.

var jsonObject = JSON.parse(stringified);

Jetzt können Sie jsonObject für das verwenden, was Sie möchten.

BEARBEITEN: Verwenden Sie diese Zeilen anstelle der vorherigen .replace()s.

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

eine genauere Vorgehensweise wäre die Verwendung eines regulären Ausdrucks. 

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

auf diese Weise wissen Sie, dass Sie das Blau für die Augen ersetzen, und nicht jedes Blau (wie die Lieblingsfarbe). Die Optionen 'g' und 'm' für reguläre Ausdrücke stehen für global, wodurch die Suche nach allen zutreffenden Übereinstimmungen ( falls Sie mehr als ein 'Auge' in Ihrem Json haben) und 'm' für Multiline. für den Fall, dass Ihre Zeichenfolge mehrzeilig ist.

0
Gal Ziv

JSON String-Manipulation kann mit JSON.parse() und JSON.stringify() einfach durchgeführt werden.

Ein Beispiel ist unten angegeben:

var Tweet = '{ "event": { "type": "message_create", "message_create": { "target": { "recipient_id": "xx_xx" }, "message_data": { "text": "xxx_xxx" } } } }';

var obj = JSON.parse(Tweet);
obj.event.message_create.target.recipient_id = Receiver;
obj.event.message_create.message_data.text = statusText;

var tweetString = JSON.stringify(obj);

Jetzt hat tweetString das aktualisierte JSON-Objekt.

0
Dhanya Gopinath

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 - Sei nett für ES Harmony

  • regel hinzufügen - fügt einen strengen Vergleich hinzu
  • matcher hinzufügen - fügt jede Funktion hinzu, die für das Abgleichen/Ersetzen von Daten verantwortlich ist 

'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'))))