Web/GoLang

[golang] interface{}로 json 언마샬 디코딩 하기

벨포트조던 2021. 8. 24.
반응형

 

목표

- 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
}

 

https://tanaikech.github.io/2017/06/02/changing-from-float64-to-int-for-values-did-unmarshal-using-mapstringinterface/

 

 


아무튼 이 두개를 조합해서 개발했다

그러나

로컬에서는 정상작동하는데, 실서버에서 float64 -> int 로 변환하는 곳에서 에러가 발생한다.

 interface conversion: interface {} is float64, not int

 

실행시 발생하는건 아닌걸로 보이는데.... 정확히 분석하려다가 굳이 interface 를 쓸필요가 없을걸로 결론남 

내가 고집해서 interface 사용하려고 억지로 한것같은 느낌이 들어서 다시 구조체로 그냥 사용했다. 

로컬에서 발생안하니 더 발견하기 짜증나기도했다..

 

쓸데 없는 모델은 한번더 선언한거같은데.... 위 interface로 하는 방식도 그리 깔끔해보이진 않아서.. 

간만에 걍 타협했음

반응형

댓글