Go에서 JSON 데이터로 작업하는 방법

Just Enough Go에 오신 것을 환영합니다! 이것은 Go programming language에 대한 일련의 기사 중 첫 번째로 가장 일반적으로 사용되는 Go standard library packages(예: encoding/json , io , net/http , sync 등. 나는 이것들을 비교적 짧게 유지하고 예제 중심으로 유지할 계획입니다.

the code is available in this GitHub repo



내가 다루고 싶은 특정 Go 주제에 대한 제안을 기꺼이 받아들일 것입니다! 부담없이 댓글을 남겨주세요😃

이 문서에서는 JSON과 Go 유형 간의 변환을 처리하는 encoding/json 패키지를 다룹니다( RFC 7159 에 따름). 바로 뛰어들자!



Go 유형을 JSON으로 변환



육군 원수



일반적인 옵션은 서명이 다음과 같은 Marshal 함수를 사용하는 것입니다.

    func Marshal(v interface{}) ([]byte, error)

다음은 예입니다.

func main() {
    profile := Profile{Email: "[email protected]", Username: "abhirockzz", Blogs: []Blog{
        Blog{BlogName: "devto", URL: "https://dev.to/abhirockzz/"},
        Blog{BlogName: "medium", URL: "https://medium.com/@abhishek1987/"},
    }}
    jsonData, err := json.Marshal(&myprofile)
    //jsonData, err := json.MarshalIndent(&profile, "", " ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(jsonData))
}

you can use MarshalIndent (commented) to indent the JSON output



인코더


Marshal 은 바이트 배열( []byte )을 처리하지만 Encoder 은 일반적이며 JSON 데이터의 싱크로 정의할 수 있는 io.Writer 으로 작업할 수 있습니다. 즉, io.Writer 인터페이스를 구현하는 모든 유형을 지정할 수 있습니다. 이것은 표준 출력( os.Stdout ) 또는 HTTP 응답( http.ResponseWriter ) 등일 수 있습니다.

func main() {
    profile := Profile{Email: "[email protected]", Username: "abhirockzz", Blogs: []Blog{
        Blog{BlogName: "devto", URL: "https://dev.to/abhirockzz/"},
        Blog{BlogName: "medium", URL: "https://medium.com/@abhishek1987/"},
    }}

    encoder := json.NewEncoder(os.Stdout)
    err := encoder.Encode(&profile)
    if err != nil {
        panic(err)
    }
}
NewEncoder 을 사용하여 io.Writer 을 지정합니다. Encode 을 호출하면 변환이 발생하고 JSON은 지정한 io.Writer에 작성됩니다.

다음은 HTTP 응답에서 작동하는 방식의 예입니다.

func main() {
    profile := Profile{Email: "[email protected]", Username: "abhirockzz", Blogs: []Blog{
        Blog{BlogName: "devto", URL: "https://dev.to/abhirockzz/"},
        Blog{BlogName: "medium", URL: "https://medium.com/@abhishek1987/"},
    }}

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        encoder := json.NewEncoder(w)
        err := encoder.Encode(&profile)
        if err != nil {
            panic(err)
        }
    })

    http.ListenAndServe(":8080", nil)
}

JSON 데이터를 Go 유형으로 변환


언마샬링



바이트 배열 형식의 JSON이 주어지면 Unmarshal 은 JSON 구문 분석 결과를 지정한 Go 데이터 유형의 포인터(일반적으로 struct )에 저장합니다.

func Unmarshal(data []byte, v interface{}) error

다음은 간단한 예입니다.

func main() {
    jsonData := `{"email":"[email protected]","username":"abhirockzz","blogs":[{"name":"devto","url":"https://dev.to/abhirockzz/"},{"name":"medium","url":"https://medium.com/@abhishek1987/"}]}`

    var profile Profile
    err := json.Unmarshal([]byte(jsonData), &profile)
    if err != nil {
        panic(err)
    }
    ...
}

디코더


Decoder은 JSON 입력 소스를 바이트 배열이 아닌 io.Reader 형식으로 지정할 수 있도록 하여 JSON 데이터를 비정렬화하는 일반적인 방법을 제공합니다.

func main() {
    jsonData := `{"email":"[email protected]","username":"abhirockzz","blogs":[{"name":"devto","url":"https://dev.to/abhirockzz/"},{"name":"medium","url":"https://medium.com/@abhishek1987/"}]}`

    jsonDataReader := strings.NewReader(jsonData)
    decoder := json.NewDecoder(jsonDataReader)

    var profile Profile
    err := decoder.Decode(&profile)
    if err != nil {
        panic(err)
    }
    ...
}

바로 가기 io.Reader 을 사용하여 JSON string 데이터에서 strings.NewReader 을 생성하는 것으로 시작합니다. 그런 다음 NewDecoder을 사용하여 디코더를 인스턴스화하고 결과가 저장되는 decode 구조체에 대한 포인터와 함께 Profile을 간단히 사용할 수 있습니다.

이것이 이 블로그의 전부입니다! 앞으로도 많은 시청 부탁드리며 좋아요와 팔로우 잊지마세요😃😃

좋은 웹페이지 즐겨찾기