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: idID, urlURL, api_keyAPIKey. Dit sluit aan bij de door Go aanbevolen stijl (en de regels voor go vet/staticcheck).
  • Snake_case JSON → PascalCase-velden: first_nameFirstName.
  • 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 UserAddress). 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