2017-11-01 4 views
0

Ich möchte von String zu Objekt konvertieren.Parse JSON von einem JSON-String-Wert

Von

{"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n}\n"} 

Um

{"key1": {"key2": "value2", "key3": {"key4": "value4"}}} 

Schließlich möchte ich value4 bekommen.

Ich kann den Wert von "key1" unter Verwendung von unten Skript erhalten.

jsondata := `{"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n}\n"}` 
var m map[string]interface{} 
json.Unmarshal([]byte(jsondata), &m) 
value := m["key1"] 
fmt.Println(value) 

https://play.golang.org/p/4lwgQJfp5S

Aber ich den Wert auf ein Objekt nicht konvertieren kann. Also kann ich "value4" nicht bekommen. Gibt es Methoden dafür? Ich kann es durch Regex wie https://play.golang.org/p/6TB-qNAdgQ bekommen Aber jetzt ist das nicht meine Lösung.

Vielen Dank für Ihre Zeit und Ratschläge. Und es tut mir leid für meine unreife Frage.

+1

@kostix Sie für die Bearbeitung von Vielen. – Elsa

Antwort

3

Es gibt zwei Ebenen der JSON-Codierung. Der erste Schritt besteht darin, den äußeren JSON-Wert zu dekodieren. Dekodieren zu einer Struktur, die der Struktur von JSON entspricht.

var outer struct{ Key1 string } 
if err := json.Unmarshal([]byte(jsondata), &outer); err != nil { 
    log.Fatal(err) 
} 

Der nächste Schritt besteht darin, den inneren JSON-Wert zu dekodieren. Decodieren Sie erneut zu einer Struktur, die der Struktur von JSON entspricht.

var inner struct{ Key3 struct{ Key4 string } } 
if err := json.Unmarshal([]byte(outer.Key1), &inner); err != nil { 
    log.Fatal(err) 
} 
// The value is inner.Key3.Key4 

playground example

Wenn die JSON nicht codiert doppelt, können Sie in einem Schuss dekodieren:

jsondata := `{"key1": { "key2": "value2", "key3": { "key4": "value4" }}}` 
var v struct { 
    Key1 struct{ Key3 struct{ Key4 string } } 
} 
if err := json.Unmarshal([]byte(jsondata), &v); err != nil { 
    log.Fatal(err) 
} 
// value is v.Key1.Key3.Key4 

playground example

+0

Ich freue mich über Ihre Antwort. Es hat gut funktioniert. Ich konnte nicht bemerken, '' struct'' zu verwenden. Ich habe deine Antwort als Lösung akzeptiert. Vielen Dank. – Elsa

+0

Ja. Danke für das Hinzufügen von mehr Wissen. Ich möchte mehr aufwerten. Aber ich war bereits uplooted. Es tut mir Leid. – Elsa

+0

Es tut mir leid. Kann ich Sie über Probleme meiner Frage fragen? Ich möchte sie zu meinen zukünftigen Fragen reflektieren. BTW, was ich eine Zeichenfolge JSON in ein Objekt mit Golang konvertieren möchten, ist falsch? – Elsa