Ich habe verschiedene json-Verhaltensweisen von go ausprobiert, daher werde ich sie zusammenfassen.
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.
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.
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.
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\""}
}
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"}
}
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"]}
}
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.
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.
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.
Recommended Posts