[golang] interface{}로 json 언마샬 디코딩 하기
목표
- model 을 쓰지 않고, 바로 json 을 언마샬하려고 한다. (바로 변수에 담기 )
- 단일 json 을 위해 model 을 만드는게 싫기 때문에 ..
https://mingrammer.com/gobyexample/json/
Go by Example: JSON
$ go run json.go true 1 2.34 "gopher" ["apple","peach","pear"] {"apple":5,"lettuce":7} {"Page":1,"Fruits":["apple","peach","pear"]} {"page":1,"fruits":["apple","peach","pear"]} map[num:6.13 strs:[a b]] 6.13 a {1 [apple peach]} apple {"apple":5,"lettuce":7}
mingrammer.com
핵심코드
byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
var dat map[string]interface{}
if err := json.Unmarshal(byt, &dat); err != nil {
panic(err)
}
fmt.Println(dat)
num := dat["num"].(float64)
fmt.Println(num)
주의할점은.. 언마샬 후 형변환을 수동으로 해야함
이것도 필수로 보자
Changing from 'float64' to 'int' for Values did Unmarshal using 'map[string]interface{}'
package main
import (
"encoding/json"
"fmt"
"reflect"
)
func main() {
data := `{"key": 10}`
var i map[string]interface{}
json.Unmarshal([]byte(data), &i)
val1 := i["key"]
fmt.Printf("%v, %v\n", val1, reflect.TypeOf(val1)) // 10, float64
i["key"] = int(i["key"].(float64))
val2 := i["key"]
fmt.Printf("%v, %v\n", val2, reflect.TypeOf(val2)) // 10, int
}
아무튼 이 두개를 조합해서 개발했다
그러나
로컬에서는 정상작동하는데, 실서버에서 float64 -> int 로 변환하는 곳에서 에러가 발생한다.
interface conversion: interface {} is float64, not int
실행시 발생하는건 아닌걸로 보이는데.... 정확히 분석하려다가 굳이 interface 를 쓸필요가 없을걸로 결론남
내가 고집해서 interface 사용하려고 억지로 한것같은 느낌이 들어서 다시 구조체로 그냥 사용했다.
로컬에서 발생안하니 더 발견하기 짜증나기도했다..
쓸데 없는 모델은 한번더 선언한거같은데.... 위 interface로 하는 방식도 그리 깔끔해보이진 않아서..
간만에 걍 타협했음