Stolpern Sie beim Konvertieren der bidirektionalen Liste in JSON in Go

Was ist passiert

Beim Codieren mit Go musste ich so etwas wie eine bidirektionale Liste in meine eigene & JSON konvertieren. Die Richtlinie lautet "encoding / json", aber es ist ein Chaos.

Zusamenfassend

ungültiger rekursiver Typ, wenn Sie sich in der Struktur befinden

Das ist selbstverständlich.

Fehler

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Person struct {
	Name   string
	Parent Person
	Child  Person
}

func main() {
	sora := Person{}
	sora.Name = "Sora Amamiya"
	j, err := json.Marshal(sora)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(j))
}

Ich werde so wütend.

$ go run main.go
# command-line-arguments
./main.go:9:6: invalid recursive type Person

Korrekt. Es scheint, dass sie trotz gegenseitiger Wiederholung wütend werden. Exzellenz.

Erfolg

Gelöst durch Fixieren an einem Zeiger.

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Person struct {
	Name   string
	Parent *Person
	Child  *Person
}

func main() {
	sora := Person{}
	sora.Name = "Sora Amamiya"
	j, err := json.Marshal(sora)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(j))
}
$ go run main.go
{"Name":"Sora Amamiya","Parent":null,"Child":null}

JSON-Umlaufblock

Dies ist das Hauptthema. Ich frage mich, wie oft ich eine bidirektionale Liste überhaupt in JSON umwandeln möchte.

Die Struktur von "Person" ist die gleiche wie zuvor. Erstellen Sie eine kleine bidirektionale Liste wie diese.

image.png

Fehler

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Person struct {
	Name   string  `json:"name"`
	Parent *Person 
	Child  *Person `json:"child"`
}


func main() {
	m := Person{}
	n := Person{}
	m.Name = "Momo Asakura"
	m.Child = &n
	n.Name = "Shiina Natsukawa"
	n.Parent = &m

	j, err := json.Marshal([]Person{m, n})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(j))
}

Die Ausgabe ist buchstäblich unendlich wütend. Es ist ein rekursiver Fehler.

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x4f30b2, 0xe)
        /usr/local/go/src/runtime/panic.go:774 +0x72
runtime.newstack()
        /usr/local/go/src/runtime/stack.go:1046 +0x6e9
runtime.morestack()
        /usr/local/go/src/runtime/asm_amd64.s:449 +0x8f

goroutine 1 [running]:
encoding/json.stringEncoder(0xc00007c000, 0x4c8f80, 0xc00000c080, 0x198, 0x100)
        /usr/local/go/src/encoding/json/encode.go:589 +0x389 fp=0xc02009a380 sp=0xc02009a378 pc=0x4a94c9
encoding/json.structEncoder.encode(0xc000082000, 0x3, 0x4, 0xc00005e2a0, 0xc00007c000, 0x4dcee0, 0xc00000c

Das ist ganz natürlich. Es ist nicht gut, eine flache Idee zu haben: "Wenn Sie kein JSON-Tag an Parent anhängen, können Sie Wanchan ignorieren?" Standardmäßig wird der Feldname wie für die Konvertierung verwendet. Eine sehr gute Bibliothek.

Erfolg

Ich wollte also "beliebige Felder in der JSON-Bibliothek ignorieren". Verwenden Sie dazu das Tag json:" - ".

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Person struct {
	Name   string  `json:"name"`
	Parent *Person `json:"-"`
	Child  *Person `json:"child"`
}

func main() {
	m := Person{}
	n := Person{}
	m.Name = "Momo Asakura"
	m.Child = &n
	n.Name = "Shiina Natsukawa"
	n.Parent = &m

	j, err := json.Marshal([]Person{m, n})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(j))
}

Klicken Sie hier für das Ausgabeergebnis. Er bringt nur Kind richtig. Wenn Sie von Root ziehen, müssen Sie Parent nicht separat löschen.

$ go run main.go
[{"name":"Momo Asakura","child":{"name":"Shiina Natsukawa","child":null}},{"name":"Shiina Natsukawa","chil
d":null}]

Zusammenfassung

Recommended Posts

Stolpern Sie beim Konvertieren der bidirektionalen Liste in JSON in Go
Beachten Sie beim Initialisieren einer Liste in Python
Praktische Schreibmethode beim kontinuierlichen Anhängen an die Liste in Python
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Zeitzonenspezifikation beim Konvertieren einer Zeichenfolge in einen Datums- / Uhrzeittyp mit Python
Verschrotten Sie die Liste der Go To EAT-Mitgliedsgeschäfte in der Präfektur Fukuoka und konvertieren Sie sie in CSV
Verschrotten Sie die Liste der Go To EAT-Mitgliedsspeicher in der Präfektur Niigata und konvertieren Sie sie in CSV
Beim Erstellen einer Matrix in einer Liste
Beachten Sie Folgendes, wenn Sie mit ndarray einen Zeilenvektor in einen Spaltenvektor konvertieren
Was tun, wenn eine Warnmeldung in der Pip-Liste angezeigt wird?
Wie kann man in Go so etwas wie eine Liste von void * (oder Variantentypen) erreichen?
Beim Versuch, Hello World in der Sprache Go auszuführen, ist eine Fehlermeldung aufgetreten
Konvertieren Sie das PDF der Go To EAT-Mitgliedergeschäftsliste in der Präfektur Niigata in CSV
So löschen Sie einen Taple in einer Liste (Python)
So erstellen Sie eine JSON-Datei in Python
Ich möchte DB-Informationen in einer Liste speichern
Beispiel-API-Server, der JSON in Golang empfängt
Fehler beim Versuch, psycopg2 in Python zu installieren
Loggen Sie sich mit json mit pygogo ein.
So entfernen Sie doppelte Elemente in der Python 3-Liste
Unterschiede im Verhalten zwischen den Operatoren append () und "+ =" beim Hinzufügen von Daten zu einer Liste in Python