Zusammenfassung des Konvertierungsverhaltens von go json

Ich habe verschiedene json-Verhaltensweisen von go ausprobiert, daher werde ich sie zusammenfassen.

Wie konvertiere ich zu json

Erstens, wie man zu json konvertiert. Der einfachste Weg, dies zu tun, besteht darin, Folgendes zu tun:

import "encoding/json"
//...
jsonout, err := json.Marshal(Zielobjekt)

Diese Methode ist leicht zu verstehen, wird jedoch in der Realität häufig in der folgenden Form konvertiert.

encoder := json.NewEncoder(io wo json geschrieben steht.Writer)
err := encoder.Encode(Zielobjekt)

Mit der obigen Methode kann jede Schnittstelle von "io.Writer" verwendet werden, sodass Sie in eine Datei (os.File), in eine http-Antwort (http.ResponseWriter) oder in einen Puffer (bufio.Writer) schreiben können. Es hat einen hohen Freiheitsgrad, wie zum Beispiel beim Schreiben.

Grundausgabe

Als nächstes schauen wir uns die Ausgabe der Grundstruktur an. Die Ausgabe von json für eine normale Struktur wie die folgende ist wie folgt.

func main() {
  type Sample struct {
    IDString string
  }
  st := Sample{IDString: "xxfff"}
  out, _ := json.Marshal(st)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output:
  // {"IDString":"xxfff"}
}

Dies ist ein Bild, in dem die Struktur direkt in json konvertiert wird. Es ist intuitiv. In Anbetracht der Namenskonvention von json ist es jedoch subtil, ob es als praktisch bezeichnet wird. Viele Leute denken, dass Jsons Schlüsselname niedrigeres Kamel ist und oft ein Schlangenfall ist. Dazu müssen Sie den Schlüsselnamen ändern. Verwenden Sie das Tag-Zeichen, um den Schlüsselnamen zu ändern. Der Fall, in dem der Schlüsselname geändert wird, ist wie folgt.

func main() {
  type Sample struct {
    IDString string `json:"id_string"`
  }

  st := Sample{IDString: "xxfff"}
  out, _ := json.Marshal(st)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output:
  // {"id_string":"xxfff"}
}

Viele Leute finden es schwierig, Tag-Zeichen einzeln einzufügen. Es gibt jedoch keine netten Optionen in der offiziellen json-Bibliothek, sodass jeder sein Bestes gibt, indem er Tools verwendet.

Über json tag

Das Format des JSON-Tags lautet wie folgt.

`(...) json:"[<key>][,<flag1>[,<flag2>]]" (...)`

Wie oben erwähnt, gibt es einige JSON-Tags, die angegeben werden können, außer dass der Schlüsselname geändert wird. Folgende Elemente können angegeben werden.

Schlüsselname

Wie der Name schon sagt, handelt es sich bei diesem Element um ein Feld mit dem Namen eines JSON-Schlüssels. Wie später beschrieben wird, ist dies die höchste Priorität unter den Schlüsselnamensspezifikationen. Wenn Sie - angeben, wird dieses Feld übersprungen. Wenn nichts geschrieben ist und nur "," geschrieben wird, wird der Name des Feldes der Struktur wie gewohnt verwendet.

omitempty

Wenn dieses Element angegeben ist, wird der Wert übersprungen, wenn der Wert Null ist. Im Fall der go-Sprache wird der Anfangswert als Nullwert behandelt, daher denke ich, dass dieses Element nicht für andere Typen als den Zeigertyp verwendet werden sollte. Das Bild ist wie folgt.

func main() {
  type Sample struct {
    ID      string  `json:",omitempty"`
    Pointer *string `json:",omitempty"`
  }
  s := Sample{ID: "", Pointer: nil}
  out, _ := json.Marshal(s)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output:
  // {}
}

string

Dieser Artikel ist persönlich etwas ganz Besonderes und ändert den Wert in einen Zeichenfolgentyp. Die folgenden integrierten Typen werden unterstützt.

Da der Zeichenfolgentyp auch in den Zeichenfolgentyp konvertiert wird, wird " maskiert und ausgegeben.

func main() {
  type Sample struct {
    ID string `json:",string"`
  }
  s := Sample{ID: "xxffid"}
  out, _ := json.Marshal(s)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output:
  // {"ID":"\"xxffid\""}
}

Ausgabereihenfolge

Die Ausgabereihenfolge ähnelt der Reihenfolge der Felder in der Struktur. Dinge wie Karten, die nicht in einer festen Reihenfolge sind, werden jedoch alphabetisch nach Schlüsselnamen sortiert. Ich fragte mich, warum dies die Reihenfolge war, aber angesichts der Leichtigkeit des Testens fühle ich mich so.

func main() {
	s := map[string]string{
		"cup":    "one",
		"apple":  "two",
		"banana": "three",
	}
	out, _ := json.Marshal(s)
	fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
	// Output:
	// {"apple":"two","banana":"three","cup":"one"}
}

Eingebetteter Typ

Die go-Sprachstruktur kann eingebettet werden. Da dieser Typ keinen Feldnamen angibt, gibt es keinen Schlüsselnamen. Daher werden grundsätzlich die Felder der eingebetteten Struktur erweitert und ausgegeben.

func main() {
  type Emb struct {
    Content string
  }
  type Sample struct {
    Emb
  }
  s := Sample{Emb: Emb{Content: "string"}}
  out, _ := json.Marshal(s)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output: {"Content":"string"}
}

Natürlich gibt es Ausnahmen, wie ich schon sagte. Die Sprache go ermöglicht Typdeklarationen für Arrays. In diesem Fall ist der Name des Schlüssels unbekannt, da die Erweiterung zur Erweiterung des Arrays führt. Daher ist der Typname der Schlüsselname mit Ausnahme des eingebetteten Typs des Arrays.

func main() {
  type Emb []string
  type Sample struct {
    Emb
  }
  s := Sample{Emb: Emb{"content1", "content2"}}
  out, _ := json.Marshal(s)
  fmt.Println(string(out)) // []Da es sich um einen Bytetyp handelt, wird er in eine Zeichenfolge konvertiert
  // Output:
  // {"Emb":["content1","content2"]}
}

Priorität des Schlüsselnamens

Aus der bisherigen Erklärung können Sie ersehen, dass der Schlüsselname durch verschiedene Faktoren bestimmt wird. Dies würde jedoch zu einem Schlüsselkonflikt führen. Daher wird die JSON-Konvertierung von go priorisiert. Die Prioritäten sind unten aufgeführt.

  1. Durch Tag angegebener Schlüsselname
  2. Normaler Feldname
  3. Eingebettet (die gleiche Priorität gilt für eingebettete Felder)

Wenn mehrere Elemente mit derselben Priorität vorhanden sind, wird kein Schlüsselwert ausgegeben und es wird kein Fehler ausgegeben. Es ist ein Verhalten, das zu passen scheint, wenn Sie beim Bereitstellen des eingebetteten Typs nicht vorsichtig sind.

Werbung

Es gibt verschiedene Verhaltensweisen, aber ich denke, dass es vielen Menschen lästig ist, sich an alle zu erinnern und nacheinander über sie nachzudenken. Also habe ich ein Tool erstellt, um herauszufinden, was die Struktur ausgibt. https://github.com/komem3/stout

Um es zu verwenden, geben Sie einfach den Dateipfad und den Strukturnamen wie unten gezeigt an.

stout -path ./define.go SimpleStruct

Ich habe es für diese Promotion geschrieben.

Verweise

Recommended Posts

Zusammenfassung des Konvertierungsverhaltens von go json
Snippet-Zusammenfassung bei der Entwicklung mit Go
Verhalten von multiprocessing.pool.Pool.map
Klasse zum Konvertieren von JSON
Stapelkonvertierung von Excel-Dateien in JSON [Python]
Tensorflow / Keras-Zusammenfassung
Zusammenfassung der Verwendung von pyenv
Funktionen der Go-Sprache
Zusammenfassung der Python-Argumente
Zusammenfassung der Testmethode
Zusammenfassung der Python-Dateivorgänge
Zusammenfassung der Python3-Listenoperationen
2017.3.6 ~ 3.12 Zusammenfassung unserer Aktivitäten
Verhalten von Matplotlib: Histgramm normiert
Bequeme Nutzungsübersicht von Flask
Zusammenfassung der Linux-Verteilungstypen
Zusammenfassung der grundlegenden Verwendung von Pandas
Verhalten der Pandas Rolling () Methode
Eine kurze Zusammenfassung von Linux
Zusammenfassung der Proxy-Verbindungseinstellungen