π ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ JSON Π² Go
Π ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ JSON Π² ΡΠ·ΡΠΊΠ΅ Go. ΠΠΎΠ»ΡΡΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π΅Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠΌ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌ.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² JSON
JSON (JavaScript Object Notation) β ΡΡΠΎ Π»Π΅Π³ΠΊΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² JavaScript. ΠΠ½ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π² ΡΠ΅ΡΠ΅Π²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ .
JSON ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ Β«ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β» ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΌΠ°ΡΡΠΈΠ²Ρ, ΡΠΈΡΠ»Π°, ΡΡΡΠΎΠΊΠΈ, Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ null. ΠΠ½ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ Π»Π΅Π³ΠΊΠΎΡΡΡ ΡΠ°Π·Π±ΠΎΡΠ° ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠ².
Π§ΡΠ΅Π½ΠΈΠ΅ JSON
ΠΠ΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (ΡΡΠ΅Π½ΠΈΠ΅ JSON) β ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠ° JSON Π² ΠΎΠ±ΡΠ΅ΠΊΡΡ Go. ΠΠ»Ρ ΡΡΠΈΡ
ΡΠ΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ°ΠΊΠ΅Ρ encoding/json
, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΡΠ·ΡΠΊΠ°. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Unmarshal
ΡΡΠΈΡΡΠ²Π°Π΅Ρ JSON-Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π°Π΄Π°Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ nil ΠΈΠ»ΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²Π΅ΡΠ½Π΅Ρ InvalidUnmarshalError
.
ΠΠ±ΡΠ°Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠ°: func Unmarshal(data []byte, v any) error
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Unmarshal
Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
type Worker struct { Name string `json:"name"` Age int `json:"age"` Job string `json:"job"` } func main() { var worker Worker jsonData := `{"name":"ΠΠ΅ΡΡ", "age":18, "job":"Backend-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ"}` err := json.Unmarshal([]byte(jsonData), &worker) if err != nil { fmt.Println("ΠΡΠΈΠ±ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ JSON-Π΄Π°Π½Π½ΡΡ :", err) } fmt.Println(worker) }
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ "{ΠΠ΅ΡΡ 18 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ}".
- Π€ΡΠ½ΠΊΡΠΈΡ
Unmarshal
ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ β ΠΎΠ½Π° ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Ρ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΌ ΡΠΈΠΏΠ°ΠΌ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ JSON-ΡΠ°ΠΉΠ»Π°.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Ρ Name
ΠΈ Age
, Π° Job
ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ. ΠΡΠ²ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ: "{ΠΠΈΡΡ 20 }".
type Worker struct { Name string `json:"name"` Age int `json:"age"` Job string `json:"job"` } ... var worker Worker jsonData := `{"name":"ΠΠΈΡΡ", "age": 20, "city":"ΠΠΎΡΠΊΠ²Π°"}` err := json.Unmarshal([]byte(jsonData), &worker)
ΠΠ°ΠΏΠΈΡΡ JSON
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (Π·Π°ΠΏΠΈΡΡ JSON) β ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠΎΡΠΌΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π² Go ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Marshal()
ΠΈΠ· ΡΠ°Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° encoding/json
. ΠΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ β ΡΡΠ΅Π· Π±Π°ΠΉΡ ΠΈ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄: func Marshal(v any) ([]byte, error)
type Worker struct { Name string `json:"name"` Age int `json:"age"` Job string `json:"job"` } func main() { workerInfo := Worker{Name: "ΠΠ°Π½Ρ", Age: 14, Job: "Go-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ"} jsonInfo, err := json.Marshal(workerInfo) if err != nil { fmt.Println("ΠΡΠΈΠ±ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ :", err) } fmt.Println(jsonInfo) }
Π‘ΡΠΎΠΈΡ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌΡΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° JSON.
- ΠΠ»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΈΠΏΠ° map ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π²ΠΈΠ΄
map[string]T
, Π³Π΄Π΅ T β Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌencoding/json
. - Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ
Marshal
Π² Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ», ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ. - ΠΠ»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ Π² Π²ΠΈΠ΄Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ. Π ΡΠ»ΡΡΠ°Π΅ nil-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ nil.
- Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ°Π½Π°Π»Ρ ΠΈ ΡΠΈΠΏ complex Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ.
ΠΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊΠΈ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΡ
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Reader ΠΈ Writer
Π Go ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° io
ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, io.Reader
ΠΈ io.Writer
. ΠΠ½ΠΈ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ
, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΠΌΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ io.Reader
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Read
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡ, ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΡ
ΠΈΠ· ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°, ΠΈ ΠΎΡΠΈΠ±ΠΊΡ. ΠΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ
io.Reader
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ io.EOF
(ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°).
type Reader interface { Read(p []byte) (n int, err error) }
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ io.Writer
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Write
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π±ΡΡΠ΅Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ
, Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ
Π² ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΈ ΠΎΡΠΈΠ±ΠΊΡ.
type Writer interface { Write(p []byte) (n int, err error) }
ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Reader
ΠΈ Writer
, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΡΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ·ΡΠΊΠ°.
ΠΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊ json.Encoder
Π‘ΡΡΡΠΊΡΡΡΠ° json.Encoder
ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ JSON-Π΄Π°Π½Π½ΡΡ
ΠΈ ΠΈΡ
ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ Π² Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Writer
.
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°: func NewEncoder(w io.Writer) *Encoder
type Shape struct { Type string `json:"name"` Width int `json:"width"` Height int `json:"height"` } func main() { // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»Π°ΠΉΡΠ° ΡΡΡΡΠΊΡΡΡ Workers Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ shapes := []Shape{ {Type: "ΠΠ²Π°Π΄ΡΠ°Ρ", Width: 10, Height: 10}, {Type: "ΠΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ", Width: 50, Height: 20}, } var buf bytes.Buffer encoder := json.NewEncoder(&buf) // ΠΠ°ΠΏΠΈΡΡ JSON-Π΄Π°Π½Π½ΡΡ Π² Π±ΡΡΠ΅Ρ if err := encoder.Encode(shapes); err != nil { fmt.Println("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ JSON-Π΄Π°Π½Π½ΡΡ :", err) return } fmt.Println(buf.String()) }
ΠΠ΅ΠΊΠΎΠ΄Π΅Ρ json.Decoder
Π‘ΡΡΡΠΊΡΡΡΠ° json.Decoder
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ JSON ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Reader
. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΈΠ· ΡΠ°ΠΉΠ»Π°, Π±ΡΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. Decoder
ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠ° JSON-Π΄Π°Π½Π½ΡΡ
Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ°: func NewDecoder(r io.Reader) *Decoder
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
type Student struct { Name string `json:"name"` Grade int `json:"grade"` } func main() { jsonData := `{"name":"ΠΠ²Π°Π½", "grade":10}` // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON reader := strings.NewReader(jsonData) // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Decoder Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° decoder := json.NewDecoder(reader) var student Student // Π§ΡΠ΅Π½ΠΈΠ΅ JSON ΠΈΠ· Π±ΡΡΠ΅ΡΠ° ΠΈ ΠΈΡ Π·Π°ΠΏΠΈΡΡ Π² student if err := decoder.Decode(&student); err != nil { fmt.Println("ΠΡΠΈΠ±ΠΊΠ° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:", err) return } fmt.Println(student.Name, student.Grade) }
ΠΠ° ΡΠΊΡΠ°Π½ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ: ΠΠ²Π°Π½ 10
Π’ΠΈΠΏ NullString
Π Go Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ NullString
Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΡΡΡΠΌΠΈ ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ JSON-Π΄Π°Π½Π½ΡΡ
. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΡΠΎΠΊΠ° ΠΏΡΡΡΠΎΠΉ ΠΈΠ»ΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΉ.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Go Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° NullString
, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΠΎΠΊΡ.
type NullString struct { String string Valid bool }
Π’ΠΈΠΏ NullString
ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ JSON-Π΄Π°Π½Π½ΡΡ
Π² Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Unmarshal
.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ NullString
.
type NullString struct { String string Valid bool } func (nstr *NullString) UnmarshalCustomData(jsonData []byte) error { // ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΠ²Π»ΡΡΡΡΡ Π»ΠΈ JSON-Π΄Π°Π½Π½ΡΠ΅ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ if string(jsonData) == "null" { nstr.Valid = false return nil } var s string // ΠΠ΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ JSON if err := json.Unmarshal(jsonData, &s); err != nil { return err } // ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠΏΡ NullString nstr.String = s nstr.Valid = true return nil }
ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΠ°ΡΠ°ΡΡΡΡ Π² JSON Ρ ΡΠ°Π½ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π±ΠΎΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ switch-case. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΈΠΏΠΎΠ².
ΠΠ»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ.
func main() { jsonData := []byte(`{"name":"ΠΠ°Π½Ρ","grade":11,"classmates":["ΠΠ΅ΡΡ", "ΠΠ³ΠΎΡΡ","ΠΠ»Π΅Π±"]}`) // ΠΠ΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ JSON-Π΄Π°Π½Π½ΡΡ var data interface{} if err := json.Unmarshal(jsonData, &data); err != nil { fmt.Println("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ JSON:", err) } // Type assertion res := data.(map[string]interface{}) // ΠΠ΅ΡΠ΅Π±ΠΎΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ for key, val := range res { switch value := val.(type) { case string: fmt.Println(key, "ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ string - ", value) case float64: fmt.Println(key, "ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ float64 - ", value) case []interface{}: fmt.Println(key, "ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ []interface{} - ", value) default: fmt.Println("ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ") } } }
ΠΡΠ²ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
name ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ string - ΠΠ°Π½Ρ grade ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ float64 - 11 classmates ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ []interface{} - [ΠΠ΅ΡΡ ΠΠ³ΠΎΡΡ ΠΠ»Π΅Π±]