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

level
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)
}
  1. 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
  1. 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
  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