-
[ Golang ] JSON Object 키 넣은 순서대로 정렬하기개발/golang 2021. 4. 2. 20:29
Golang 에서는 일반적인 JsonMarshal 을 통한 encoding 은 키순서 오름차순으로 encoding 이 되게끔 되어있다.
사실 Object 에는 키순서는 따로 중요하지 않지만 Object 키가 저장된 그대로 나와야하는 상황이 있으면 다음과 같은 로직이 필요하다.
package order_json_object import ( "bytes" "encoding/json" ) type OrderJsonMap struct { Order []string Map map[string]string } func (om OrderJsonMap) MarshalJSON() ([]byte, error) { var b []byte buf := bytes.NewBuffer(b) buf.WriteRune('{') l := len(om.Order) for i, key := range om.Order { km, err := json.Marshal(key) if err != nil { return nil, err } buf.Write(km) buf.WriteRune(':') vm, err := json.Marshal(om.Map[key]) if err != nil { return nil, err } buf.Write(vm) if i != l-1 { buf.WriteRune(',') } } buf.WriteRune('}') return buf.Bytes(), nil } package order_json_object_test import ( "encoding/json" "github.com/hoyeonUM/golang-example/order_json_object" "github.com/stretchr/testify/assert" "testing" ) func TestConcurrent(t *testing.T) { t.Run(`given string map first key is b and second key is a when parse json then first key is a and second key is b`, func(t *testing.T) { notOrderJson := make(map[string]string) notOrderJson["b"] = "bbb" notOrderJson["a"] = "aaa" b, _ := json.Marshal(notOrderJson) assert.Equal(t, `{"a":"aaa","b":"bbb"}`, string(b)) }) t.Run(`given string map first key is b and second key is a when parse order json then first key is b and second key is a`, func(t *testing.T) { notOrderJson := make(map[string]string) notOrderJson["b"] = "bbb" notOrderJson["a"] = "aaa" OrderJson := order_json_object.OrderJsonMap{} OrderJson.Order = []string{"b", "a"} OrderJson.Map = notOrderJson b, _ := json.Marshal(OrderJson) assert.Equal(t, `{"b":"bbb","a":"aaa"}`, string(b)) }) }
참고문서 : https://stackoverflow.com/questions/48293036/prevent-alphabetically-ordering-json-at-marshal
'개발 > golang' 카테고리의 다른 글
[ Golang ] Rest Api 스펙이 틀릴때 (타입이 틀릴때) Json decode(Unmarshal) 하기 (0) 2021.04.02 [ Golang ] Go 루틴 최대갯수를 제한하기 (0) 2021.04.02 mariadb 에서 elasticsearch 실시간 연동하기 (0) 2021.03.30 [ Golang ] Go 루틴을 테스트 하기 (gomock) (0) 2021.03.11