JSON and Data Exchange
Unmarshal Struct
A small JSON string can be read into a Go struct value.
unmarshal
Unmarshaling is the idea of reading JSON data and assigning matching fields in a Go value.
Unmarshal Struct
unmarshal_struct.go
Replay: real traced execution (multi-file project)
package main
import (
"fmt"
"strconv"
"strings"
)
type Lesson struct {
Title string
Level int
}
func main() {
var level = 2
raw := fmt.Sprintf(`{"title":"JSON","level":%d}`, level)
levelText := strings.TrimSuffix(strings.Split(raw, `"level":`)[1], "}")
parsedLevel, err := strconv.Atoi(levelText)
if err != nil {
fmt.Println("parsed=", false)
return
}
lesson := Lesson{Title: "JSON", Level: parsedLevel}
fmt.Println("raw=", raw)
fmt.Println("title=", lesson.Title)
fmt.Println("level=", lesson.Level)
}
package main
import (
"fmt"
"strconv"
"strings"
)
type Lesson struct {
Title string
Level int
}
func main() {
var level = 1
raw := fmt.Sprintf(`{"title":"JSON","level":%d}`, level)
levelText := strings.TrimSuffix(strings.Split(raw, `"level":`)[1], "}")
parsedLevel, err := strconv.Atoi(levelText)
if err != nil {
fmt.Println("parsed=", false)
return
}
lesson := Lesson{Title: "JSON", Level: parsedLevel}
fmt.Println("raw=", raw)
fmt.Println("title=", lesson.Title)
fmt.Println("level=", lesson.Level)
}
package main
import (
"fmt"
"strconv"
"strings"
)
type Lesson struct {
Title string
Level int
}
func main() {
var level = 4
raw := fmt.Sprintf(`{"title":"JSON","level":%d}`, level)
levelText := strings.TrimSuffix(strings.Split(raw, `"level":`)[1], "}")
parsedLevel, err := strconv.Atoi(levelText)
if err != nil {
fmt.Println("parsed=", false)
return
}
lesson := Lesson{Title: "JSON", Level: parsedLevel}
fmt.Println("raw=", raw)
fmt.Println("title=", lesson.Title)
fmt.Println("level=", lesson.Level)
}
level ← 2, raw ← "{\"title\":\"JSON\",\"level\":2}", levelText ← "2"
14func main() {15 var level→ 2 = 2 //@level=1, 416 raw→ "{\"title\":\"JSON\",\"level\":2}" := fmt.Sprintf(`{"title":"JSON","level":%d}`, level2)1718 levelText→ "2" := strings.TrimSuffix(strings.Split(raw"{\"title\":\"JSON\",\"level\":2}", `"level":`)[1], "}")19 parsedLevel→ 2, err→ <nil> := strconv.Atoi(levelText"2")20 if err != nil {21 fmt.Println("parsed=", false)22 return23 }24 lesson→ main.Lesson{Title:"JSON", Level:2} := Lesson{Title: "JSON", Level: parsedLevel2}2526 fmt.Println("raw=", raw"{\"title\":\"JSON\",\"level\":2}")27 fmt.Println("title=", lesson.Title"JSON")28 fmt.Println("level=", lesson.Level2)29}outputraw= {"title":"JSON","level":2} title= JSON level= 2
level ← 1, raw ← "{\"title\":\"JSON\",\"level\":1}", levelText ← "1"
14func main() {15 var level→ 1 = 116 raw→ "{\"title\":\"JSON\",\"level\":1}" := fmt.Sprintf(`{"title":"JSON","level":%d}`, level1)1718 levelText→ "1" := strings.TrimSuffix(strings.Split(raw"{\"title\":\"JSON\",\"level\":1}", `"level":`)[1], "}")19 parsedLevel→ 1, err→ <nil> := strconv.Atoi(levelText"1")20 if err != nil {21 fmt.Println("parsed=", false)22 return23 }24 lesson→ main.Lesson{Title:"JSON", Level:1} := Lesson{Title: "JSON", Level: parsedLevel1}2526 fmt.Println("raw=", raw"{\"title\":\"JSON\",\"level\":1}")27 fmt.Println("title=", lesson.Title"JSON")28 fmt.Println("level=", lesson.Level1)29}outputraw= {"title":"JSON","level":1} title= JSON level= 1
level ← 4, raw ← "{\"title\":\"JSON\",\"level\":4}", levelText ← "4"
14func main() {15 var level→ 4 = 416 raw→ "{\"title\":\"JSON\",\"level\":4}" := fmt.Sprintf(`{"title":"JSON","level":%d}`, level4)1718 levelText→ "4" := strings.TrimSuffix(strings.Split(raw"{\"title\":\"JSON\",\"level\":4}", `"level":`)[1], "}")19 parsedLevel→ 4, err→ <nil> := strconv.Atoi(levelText"4")20 if err != nil {21 fmt.Println("parsed=", false)22 return23 }24 lesson→ main.Lesson{Title:"JSON", Level:4} := Lesson{Title: "JSON", Level: parsedLevel4}2526 fmt.Println("raw=", raw"{\"title\":\"JSON\",\"level\":4}")27 fmt.Println("title=", lesson.Title"JSON")28 fmt.Println("level=", lesson.Level4)29}outputraw= {"title":"JSON","level":4} title= JSON level= 4