0Pricing
Go Academy · Lezione

Ripasso di encoding/json

Eseguire il marshal e l'unmarshal di JSON

Ripasso di encoding/json è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

JSON in Go

JSON è il formato dati più comune per le API. Il pacchetto standard di Go encoding/json converte i valori Go in testo JSON e viceversa.

Marshal: da Go a JSON

json.Marshal converte un valore Go in uno slice di byte JSON. È possibile convertirlo in una stringa per stamparlo.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	data := map[string]int{"a": 1, "b": 2}
	b, _ := json.Marshal(data)
	fmt.Println(string(b))
}

Serializzazione di una struct

Le struct vengono serializzate campo per campo. I campi esportati diventano chiavi JSON.

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string
	Age  int
}

func main() {
	b, _ := json.Marshal(User{"Ann", 30})
	fmt.Println(string(b))
}

Unmarshal: da JSON a Go

json.Unmarshal analizza i byte JSON e li inserisce in un valore Go. Passare un puntatore consente alla funzione di valorizzare la variabile.

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string
	Age  int
}

func main() {
	var u User
	json.Unmarshal([]byte("{\"Name\":\"Bob\",\"Age\":25}"), &u)
	fmt.Println(u)
}

Tag per i nomi delle chiavi

Usare i tag json per controllare i nomi delle chiavi, come illustrato in precedenza. In questo caso, Name corrisponde alla chiave JSON name.

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string "json:\"name\""
}

func main() {
	b, _ := json.Marshal(User{"Ann"})
	fmt.Println(string(b))
}

Controllare sempre gli errori

Sia Marshal sia Unmarshal restituiscono un errore. Nel codice reale, non ignorarlo mai: JSON malformato o tipi non supportati producono errori.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var v int
	err := json.Unmarshal([]byte("not json"), &v)
	fmt.Println(err)
}

Decodifica nelle mappe

Quando non si conosce in anticipo la struttura dei dati, effettuare l'unmarshal in map[string]interface{}.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var m map[string]interface{}
	json.Unmarshal([]byte("{\"x\":1,\"y\":\"hi\"}"), &m)
	fmt.Println(m["x"], m["y"])
}

Slice e array

Gli array JSON corrispondono agli slice Go. La serializzazione di uno slice produce un array JSON.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	b, _ := json.Marshal([]string{"a", "b", "c"})
	fmt.Println(string(b))
}

Formattazione leggibile

json.MarshalIndent aggiunge l'indentazione per ottenere un output leggibile.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	data := map[string]int{"a": 1}
	b, _ := json.MarshalIndent(data, "", "  ")
	fmt.Println(string(b))
}

I numeri sono float64

Quando si esegue il decoding in interface{}, in Go tutti i numeri JSON diventano float64. Se serve un int, è necessario effettuare una conversione esplicita.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var v interface{}
	json.Unmarshal([]byte("42"), &v)
	fmt.Printf("%T %v\n", v, v)
}

Round trip

È possibile serializzare e poi deserializzare i dati per copiarli tramite JSON. Per i tipi supportati, i valori vengono recuperati intatti.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	orig := []int{1, 2, 3}
	b, _ := json.Marshal(orig)
	var back []int
	json.Unmarshal(b, &back)
	fmt.Println(back)
}

Verifica rapida

Perché è necessario passare un puntatore a json.Unmarshal?

Riepilogo

encoding/json:

  • json.Marshal converte i valori Go in JSON
  • json.Unmarshal analizza il JSON usando un puntatore
  • I tag rinominano le chiavi; i numeri vengono decodificati come float64 in interface{}
  • Controllare sempre l'errore restituito

Domande Frequenti

La lezione «Ripasso di encoding/json» è gratuita?

Sì — il testo completo di «Ripasso di encoding/json» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Ripasso di encoding/json»?

Eseguire il marshal e l'unmarshal di JSON Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Ripasso di encoding/json»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ripasso di encoding/json
  2. encoding/xml
  3. encoding/csv
  4. gob e codifica binaria
← Torna a Go Academy