Golang json 문자열 파싱하는 GJSON 라이브러리 알아보기

오늘은 Golang으로 SVG를 생성할 수 있는 GJSON 라이브러리를 알아보려 합니다.

GJSON 설치

우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.

맥에서 brew로 쉽게 설치할 수 있습니다.

brew install go

우분투에서도 apt로 쉽게 설치할 수 있습니다.

sudo apt-get install golang-go

맥에서 Golang의 버전을 올리려면 brew를 이용합니다.

brew upgrade go

우분투에서도 Golang의 버전을 올리려면 backports 저장소를 등록하고 apt를 이용합니다.

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go

go get으로 GJSON 패키지를 설치합니다.

go get -u github.com/tidwall/gjson

홈의 go 폴더에 GJSON 소스코드와 패키지 파일이 생성됩니다.

예제

package main

해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언합니다.

import (
	"fmt"
	"strings"

	"github.com/tidwall/gjson"
)

fmt와 strings 그리고 gjson을 가져옵니다.

const json = `{"map":{"first":"hello","last":"world"},
"list": ["first","second","third"],
"int":10}`

json 문자열을 만들어둡니다.

func main() {
	gjson.AddModifier("custom", func(json, arg string) string {
		if arg == "upper" {
			return strings.ToUpper(json)
		}
		if arg == "lower" {
			return strings.ToLower(json)
		}
		return json
	})

	result := gjson.Get(json, "map.last")
	fmt.Println(result.String())

	result = gjson.Get(json, "map.last|@custom:upper")
	fmt.Println(result.String())

modifiers를 직접 커스텀할 수 있습니다.

직접만든 modifiers로 원하는 결과를 가져올 수 있습니다.

	gjson.ForEachLine(json, func(line gjson.Result) bool {
		fmt.Println(line.String())
		return true
	})

여러 줄의 json 문자열을 iterate하게 가져옵니다.

	result = gjson.Get(json, "list")
	for _, name := range result.Array() {
		fmt.Println(name.String())
	}

Array로 가져올 수 있습니다.

	result = gjson.Get(json, "map")
	result.ForEach(func(key, value gjson.Result) bool {
		fmt.Println(value.String())
		return true
	})

key, value로 나누어서 반복적으로 가져옵니다.

	fmt.Println(gjson.Parse(json).Get("map").Get("last"))

간단하게 한 줄로 json 문자열을 파싱해서 원하는 부분만 가져올 수 있습니다.

	result = gjson.Get(json, "map.last")
	if !result.Exists() {
		panic("no last map")
	}

값이 존재하는지 확인할 수 있습니다.

	if !gjson.Valid(json) {
		panic("invalid json")
	}

json 파일인지 확인할 수 있습니다.

	content, ok := gjson.Parse(json).Value().(map[string]interface{})
	if !ok {
		panic("err")
	}
	fmt.Println(content)
}

map으로 만들어서 내용을 출력할 수 있습니다.

Written on September 19, 2019