JSON 문서 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

프로그래밍 환경이 급격히 인터넷 기반으로 발전하면서 JSON(JavaScript Object Notation) 형식이 널리 쓰이고 있습니다. 이번에는 Go 언어에서 JSON을 사용하는 방법에 대해 알아보겠습니다.

다음은 encoding/json 패키지에서 제공하는 JSON 함수입니다.

  • 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 언어 자료형으로 변환

먼저 JSON 문서를 읽는 방법입니다.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	doc := `
	{
		"name": "maria",
		"age": 10
	}
	`

	var data map[string]interface{} // JSON 문서의 데이터를 저장할 공간을 맵으로 선언

	json.Unmarshal([]byte(doc), &data) // doc를 바이트 슬라이스로 변환하여 넣고,
                                           // data의 포인터를 넣어줌

	fmt.Println(data["name"], data["age"]) // maria 10: 맵에 키를 지정하여 값을 가져옴
}

JSON 문서를 Go 언어에서 읽으려면 encoding/json 패키지의 Unmarshal 함수를 사용합니다. 여기서 JSON 문서의 데이터를 저장할 공간이 필요한데 간단하게 맵으로 만들 수 있습니다.

var data map[string]interface{} // JSON 문서의 데이터를 저장할 공간을 맵으로 선언

JSON 문서에서 키는 문자열이며 값은 문자열과 숫자를 사용하고 있습니다. 따라서 맵을 만들 때 키는 문자열로 지정하고 값은 interface{}로 지정하여 모든 값을 넣을 수 있도록 합니다.

이제 json.Unmarshal 함수에 JSON 문자열을 []byte 형식으로 변환하여 넣고, 맵의 포인터도 넣습니다.

json.Unmarshal([]byte(doc), &data) // doc를 바이트 슬라이스로 변환하여 넣고, data의 포인터를 넣어줌

이제 맵에서 data[“name”]처럼 키를 지정하면 값을 가져올 수 있습니다.

fmt.Println(data["name"], data["age"]) // maria 10: 맵에 키를 지정하여 값을 가져옴

이번에는 맵 형태의 데이터를 JSON 형태로 변환해보겠습니다.

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	data := make(map[string]interface{}) // 문자열을 키로하고 모든 자료형을 저장할 수 있는 맵 생성

	data["name"] = "maria"
	data["age"] = 10

	doc, _ := json.Marshal(data) // 맵을 JSON 문서로 변환

	fmt.Println(string(doc)) // {"age":10,"name":"maria"}: 문자열로 변환하여 출력
}

문자열을 키로하고 모든 자료형을 값으로 저장할 수 있는 맵을 할당합니다. 그리고 적절히 데이터를 대입한 뒤 json.Marshal 함수를 사용하여 JSON 문서로 변환합니다.

json.Marshal 함수에서 리턴된 값은 []byte 형식이므로 출력할 때는 string 형식으로 변환해줍니다.

JSON 문서로 변환했을 때 한 줄로 붙어서 나오면 사람이 읽기 힘듭니다. 따라서 다음과 같이 json.MarshalIndent 함수를 사용하면 사람이 쉽게 읽을 수 있도록 변환할 수 있습니다.

doc, _ := json.MarshalIndent(data, "", "  ")

첫 번째 매개변수는 JSON 문서로 만들 데이터입니다. 그리고 두 번째 매개변수는 JSON 문서의 첫 칸에 표시할 문자열(Prefix)인데 보통 "" (빈 문자)를 지정합니다. 마지막으로 세 번째 매개변수는 들여쓰기할 문자입니다. 공백 문자나 탭 문자를 사용할 수 있습니다.

Prefix는 표시하지 않고, 들여쓰기는 2칸으로 지정하면 다음과 같이 JSON 문서로 변환됩니다.

{
  "age": 10,
  "name": "maria"
}

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015