JSON naar Go-structuur

Volgende

Plak een JSON-sample en haal de Go-structuurdefinities die deze met encoding/json correct kunnen verwerken. De velden worden geëxporteerd (CamelCase), gemarkeerd met de oorspronkelijke JSON-sleutels, omgezet in pointers wanneer een waarde mogelijk null is, en nestobjecten krijgen hun eigen genoemde structuurdeclaraties.

Hoe je JSON omzet in een Go-structuur

  1. 1

    Plak de JSON

    Een enkel monster is voldoende; meerdere monsters verbeteren de inferentie van nullwaarden.

  2. 2

    Kies een naam

    Voor geëxporteerde velden geldt PascalCase als de standaardconventie in Go. Kies een afkortingsstijl (bijvoorbeeld `URL` versus `Url` of `ID` versus `Id`).

  3. 3

    Kies een optionele strategie

    Gebruik pointers voor nullabele velden (de meest idiomatische manier) of `omitempty`-taggen.

  4. 4

    Kopieer de structuren

    Een wortelstructuur met ingebedde structuren. Plaats deze in een `.go`-bestand en selecteer `go build`.

Voorbeelduitvoering

Voor:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Uitvoer:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

Type-mapping

JSON-waarde Go-type
string string
gehele getal int of int64
nummer (decimaal) float64
booleaanse waarde bool
null (met een niet-null broer of zus) *T (aanwijzer)
array []T
object Genoemde structuur
gemengde matrix []interface{}

Naamgeving van idiomen die de generator volgt

  • Initialismen in hoofdletters: id → ID, url → URL, api_key → APIKey. Dit sluit aan bij de door Go aanbevolen stijl (en de regels voor go vet/staticcheck).
  • Snake_case JSON → PascalCase-velden: first_name → FirstName.
  • Enkele woorden in afkortingen behouden: IP blijft IP; HTTP blijft HTTP.
  • JSON-tag: json:"first_name" behoudt de oorspronkelijke sleutel, waardoor de codering en decodering soepel verlopen.

Optionele velden: pointer of omitempty?

Strategie Gebruik bij
pointer (*T) U moet ‘afwezig’ onderscheiden van ‘nulwaarde’
omitempty U wilt alleen nulwaarden overslaan bij het marshalen; unMarshal slaat een nulwaarde op voor ontbrekende waarden
Geen van beide Het veld is altijd aanwezig en nulwaarden zijn betekenisvol

De generator gebruikt standaard de pointer + omitempty voor waarden die als null worden gezien; instellen op basis van uw semantiek.

Veelvoorkomende fouten

  • Gebruik int wanneer de JSON-integrale waarde groter is dan die van MaxInt32 op een 32-bits-doelplatform. Gebruik int64 voor bekende grote waarden.
  • Omkeer van de ordening en verlies van de belangrijke sleutels: encoding/json genereert sleutels volgens de volgorde van de veldbeschrijvingen, niet volgens de oorspronkelijke JSON-structuur. Sorteer deze handmatig als u een canonische uitvoer nodig hebt.
  • Arrays met gemengde vormen: []interface{} mist de typveiligheid. Overweeg in plaats daarvan unietypen met een discriminatorveld van type.
  • Vergeten van omitempty bij optionele velden: zonder deze wordt het optionele veld niet weggelaten, maar wordt als "foo": null geserialiseerd.

Veelgestelde vragen

Gebruik pointers wanneer u moet onderscheiden tussen ‘veld ontbreekt’ en ‘veld is nul’. Gebruik omitempty wanneer de nulwaarde geen geldige zakelijke waarde is ("", 0 en false betekenen altijd ‘vergeet dit’). Veel teams kiezen voor één standaardcode en hanteren deze consistent in hun gehele codebasis.

Elk geneste object wordt een aparte, genoemde structuurdefinitie (bijvoorbeeld User → Address). Typen worden alleen ingelijnd wanneer de geneste structuur klein is en slechts één keer wordt gebruikt; anders krijgt u schone, herbruikbare typen.

Ja. id wordt ID, url wordt URL en api_key wordt APIKey. Dit is wat go vet verwacht en wat de meeste Go-stijlgidsen aanbevelen.

De generator genereert eenvoudige structuren met standaard json:-taggen. Voor aangepaste UnmarshalJSON-implementaties (bijvoorbeeld voor data in niet-ISO-formaten) moeten deze na generatie handmatig worden toegevoegd.

Gerelateerde tools

Tool beschikbaar in andere talen