[Go] jsun

๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223184628396

๊นƒํ—™
https://github.com/myyrakle/jsun

Go์˜ ๋ชป๋‚œ ๋ถ€๋ถ„์„ ๋•œ๋นตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  JSON ๋””์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
์Œฉ์œผ๋กœ ๋งŒ๋“ ๊ฑด ์•„๋‹ˆ๊ณ , encoding/json ๊ฐ€์ ธ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๊ณ ์น˜๊ธฐ๋งŒ ํ–ˆ๋‹ค.

๋™์ž‘์ด ๋‹ฌ๋ผ์ง„๊ฑด ์ด๋Ÿฐ ๋ถ€๋ถ„์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ™์€ json ํƒœ๊ทธ๋ช…์„ ๊ฐ€์ง€๋ฉด์„œ ์‹คํŒจ ๊ฐ€๋Šฅ(failable)ํ•˜๋„๋ก ์„ค์ •ํ•ด๋‘๋ฉด, ๊ฐ™์€ json ํ•„๋“œ๊ฐ’์ด ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์™€๋„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
failable์€ ๋‹จ์ผ ํ•„๋“œ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
unmarshal์ด ์‹คํŒจํ•œ ํ•„๋“œ๋Š” ๊ทธ๋ƒฅ zero value ๊ทธ๋Œ€๋กœ ์„ค์ •๋œ๋‹ค.

๊ทธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋‹ค.

package main

import (
	"fmt"

	json "github.com/myyrakle/jsun"
)

type TradeDetail struct {
	ItemID string `json:"item_id"`
}

type TradeHistory struct {
	TradeID    string        `json:"trade_id"`
	DetailList []TradeDetail `json:"detail,failable"`
	Detail     TradeDetail   `json:"detail,failable"`
}

func main() {
	testcase1 := `{ "trade_id": "1234", "detail": { "item_id": "abcd" }, "foo": "bar" }`
	testcase2 := `{ "trade_id": "1234", "detail": [{ "item_id": "abcd" }] }`

	var history TradeHistory
	if err := json.Unmarshal([]byte(testcase1), &history); err != nil {
		fmt.Println("testcase1 failed")
		fmt.Println(err)
	} else {
		fmt.Println("testcase1 passed")
	}

	fmt.Printf("history %#v\n", history)

	var history2 TradeHistory
	if err := json.Unmarshal([]byte(testcase2), &history2); err != nil {
		fmt.Println("testcase2 failed")
		fmt.Println(err)
	} else {
		fmt.Println("testcase2 passed")
	}
	fmt.Printf("history2 %#v\n", history2)
}