Go:
JSON 작업하기

방법:

Go에서는 encoding/json 패키지가 JSON 처리의 관문으로, Go 데이터 구조를 JSON으로 변환(마샬링)하고 돌아가는(언마샬링) 메커니즘을 제공합니다. 아래는 시작하는 데 도움이 될 기본 예시들입니다:

인코딩(마샬링)

Go 구조체를 JSON으로 변환하려면 json.Marshal을 사용할 수 있습니다. 다음 Go 구조체를 고려해보세요:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type User struct {
    ID        int      `json:"id"`
    Username  string   `json:"username"`
    Languages []string `json:"languages"`
}

func main() {
    user := User{1, "JohnDoe", []string{"Go", "JavaScript", "Python"}}
    userJSON, err := json.Marshal(user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(userJSON))
}

출력:

{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}

디코딩(언마샬링)

Go 데이터 구조로 JSON을 파싱하려면 json.Unmarshal을 사용하세요:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

func main() {
    jsonStr := `{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}`
    var user User
    err := json.Unmarshal([]byte(jsonStr), &user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v\n", user)
}

이전과 같이 User 구조체를 주어졌을 때, 이 코드는 JSON 문자열을 User 인스턴스로 파싱합니다.

출력:

{ID:1 Username:JohnDoe Languages:[Go JavaScript Python]}

심층 분석

Go의 encoding/json 패키지는 JSON 처리에서 관련된 많은 복잡성을 추상화하는 간단한 API를 제공합니다. Go 개발 초기에 도입된 이 패키지는 단순성과 효율성이라는 Go의 철학을 반영합니다. 하지만, encoding/json이 런타임에 구조체를 조사하고 수정하기 위해 리플렉션을 사용한다는 사실은 CPU 집약적 시나리오에서 최적의 성능이 되지 않을 수 있습니다.

json-iterator/goffjson 같은 대안들이 나타나서, 정적 마샬링 및 언마샬링 코드를 생성함으로써 더 빠른 JSON 처리를 제공합니다. 하지만, encoding/json은 그 단순함, 강건함, 그리고 표준 라이브러리의 일부라는 사실 때문에 Go 버전에 걸쳐 호환성과 안정성을 보장하면서 가장 흔히 사용되는 패키지로 남아 있습니다.

상대적으로 느린 성능에도 불구하고, 사용의 용이성과 Go의 타입 시스템과의 통합은 encoding/json을 대부분의 애플리케이션에 적합하게 만듭니다. 성능이 중요한 맥락에서 일하는 이들에게는 외부 라이브러리를 탐색하는 것이 가치가 있을 수 있지만, 많은 경우에 표준 라이브러리는 속도, 단순성, 그리고 신뢰성 사이에 적절한 균형을 이룹니다.