[FIXED] Bearbeiten von Json in Go ohne vorheriges Unmarshalling in Structs

Ausgabe

Ich habe ein kleines Problem. Also schreibe ich ein Tool in go, das mit einigen JSON-Dateien funktioniert. Das Tool funktioniert so, dass das Devops-Mitglied, das es verwendet, seine JSON-Datei in den angegebenen Ordner innerhalb des Projekts hochladen soll und diese JSON-Datei dann von dort aus verwendet wird, um eine API in api-gateway bereitzustellen (die JSON ist eigentlich eine Prahlerei mit Erweiterungen, aber das ist für meine Frage nicht besonders wichtig)

Das Problem, das ich habe, ist, dass ich EINE Zeile im JSON aktualisieren muss. Jede übergebene Datei ist anders, aber es ist garantiert, dass sie jedes Mal eine URL an derselben Stelle hat, nur aufgrund der Art des Projekts. Ich muss diese URL automatisch aktualisieren.

Aufgrund der Tatsache, dass die JSON-Dateien unterschiedlich sind, kommt das Einrichten von hartcodierten Strukturen und das Unmarshalling zum Bearbeiten nicht in Frage. Das Ziel ist, dass die Devops-Mitglieder nicht einmal in den Code einsteigen müssen, sondern nur ihre Dateien bereitstellen müssen, weshalb ich auf eine Automatisierung gehofft hatte.

Bisher haben meine Recherchen nichts ergeben. Es scheint, dass Go die Bearbeitung von JSON nur unterstützt, wenn es zuerst in Strukturen entmarshallt wird (siehe Ändern der JSON-Datei mit Golang ). Gibt es eine Möglichkeit, ohne die Strukturen zu bearbeiten, wenn ich genau weiß, wonach ich suche, wird immer im JSON verfügbar sein, obwohl jede Datei anders ist?

Dies ist erst mein erster Monat, in dem ich go verwende, daher gibt es möglicherweise eine einfache Lösung. Ich habe einige Erwähnungen von Scannern aus der Megajson-Bibliothek gesehen, aber ich kann das anscheinend auch nicht zum Laufen bringen

{
"paths": {
    "/account": {
        "post": {
            "something": "body",
            "api": {
                "uri": "http://thisiswhereineedtoedit.com"
            }
        }
    }
}

}

Lösung

Unmarshall zu interface{}. Gehen Sie verschachtelte Objekte nach unten, um das Objekt mit dem festzulegenden Wert zu finden. Stellen Sie den Wert ein. Marshal zurück zu JSON.

var root interface{}
if err := json.Unmarshal(d, &root); err != nil {
    log.Fatal(err)
}

// Walk down path to target object.
v := root
var path = []string{"paths", "/account", "post", "api"}
for i, k := range path {
    m, ok := v.(map[string]interface{})
    if !ok {
        log.Fatalf("map not found at %s", strings.Join(path[:i+1], ", "))
    }
    v, ok = m[k]
    if !ok {
        log.Fatalf("value not found at %s", strings.Join(path[:i+1], ", "))
    }
}

// Set value in the target object.
m, ok := v.(map[string]interface{})
if !ok {
    log.Fatalf("map not found at %s", strings.Join(path, ", "))
}
m["uri"] = "the new URI"

// Marshal back to JSON. Variable d is []byte with the JSON
d, err := json.Marshal(root)
if err != nil {
    log.Fatal(err)
}

Ersetzen Sie Aufrufe von log.Fatal durch die für Ihre Anwendung geeignete Fehlerbehandlung.

Beispiel Spielplatz


Beantwortet von –
Cerise Limón


Antwort geprüft von –
David Goodson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like