일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- range
- tcp
- json
- API
- install
- Golang
- Callback
- write
- mutex
- JavaScript
- Python
- 책
- GO 언어
- FOR
- Close
- Sync
- c++
- 영화
- go언어
- channel
- 리뷰
- File
- window
- go
- bitcoin
- windows
- C
- http
- package
- Linux
- Today
- Total
Code Habit
Golang ) Json 데이터 사용하기 본문
마샬링
논리적 구조를 로우 바이트로 변경하는 것을 마샬링 or 인코딩이라 한다. 즉 Go 자료형을 바이트 슬라이스로 변경하는 것이다.
언마샬링
반대로 로우 바이트를 논리적 자료 구조로 변경하는 것을 언마샬링 or 디코딩이라 한다.
encoding/json 패키지의 다음 함수들을 통해 go 자료형을 Json데이터로 변환하거나 반대로 Json데이터를 go 자료형으로 변환할 수 있다.
-
func Marshal(v interface{})([]byte, error): Go 언어 자료형 -> JSON 데이터 변환
-
func MarshalIndent(v interface{}, prefix, indent string)([]byte, error): Go 언어 자료형 -> JSON 데이터 변환 & 들여쓰기
-
func Unmarshal(data []byte, v interface{}) error : JSON 데이터 -> Go 언어 자료형 변환
사용 예제
// main.go
package main
import (
"encoding/json"
"fmt"
)
func main() {
fmt.Println("json example")
b, err := json.Marshal(true) // bool 데이터를 json 데이터로 변환
fmt.Println(b) // [116 114 117 101]
fmt.Println(string(b)) // true
}
|
bool형 데이터(true)를 json.Marshal 함수를 통해 json데이터로 변환하는데 반환되는 값은 []bye 형식이므로 보기 좋게 string형식으로 변환하여 출력해준다.
// main.go
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"` // 태그설정 : "name"
Age int `json:"age"` // 태그설정 : "age"
}
func main() {
p := Person{"Jason", 26}
byteArray, err := json.Marshal(p) // p 데이터 json데이터로 변환
if err != nil {
fmt.Println(err)
}
fmt.Println(p) // {Jason 26}
fmt.Println(string(byteArray)) // {"name":"Jason","age":26}
byteArray, err = json.MarshalIndent(p, "", " ") // 들여쓰기 적용하여 변환
fmt.Println(string(byteArray)) // {
} // "name":"Jason",
// "age":26
// }
|
구조체 Person을 선언해주고 각 멤버에 json 태그를 설정해준다. 이렇게 태그를 적용하면 json 데이터의 키를 소문자로 시작할 수 있다. ex) Name -> name. json.Marshal 함수로 변환하면 한줄로 출력되므로 보기 좋게 json.MarshalIndent 함수로 들여쓰기를 적용한다.
// main.go
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"` // 태그설정 : "name"
Age int `json:"age"` // 태그설정 : "age"
}
func main() {
p := Person{"Jason", 26}
byteArray, err := json.Marshal(p) // p 데이터 json데이터로 변환
if err != nil {
fmt.Println(err)
}
fmt.Println(p) // {Jason 26}
fmt.Println(string(byteArray)) // {"name":"Jason","age":26}
byteArray, err = json.MarshalIndent(p, "", " ") // 들여쓰기 적용하여 변환
fmt.Println(string(byteArray)) // {
// "name":"Jason",
// "age":26
// }
var data map[string]interface{} // JSON 문서의 데이터를 저장할 공간을 맵으로 선언
json.Unmarshal([]byte(byteArray), &data) // json데이터를 맵 데이터로 변환
fmt.Println(data) // map[age;26 name:Jason]
fmt.Println(data["name"]) // Jason
fmt.Println(data["age"]) // 26
}
|
json 데이터로 변환 된 데이터를 다시 map 데이터로 변환하여 출력하였다. json 데이터의 필드명은 map데이터의 키(string)가 되는 것을 알 수 있다.