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.
json:" - "
und verhindern es.Das ist selbstverständlich.
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.
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}
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.
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.
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}]