본문 바로가기
program lang/golang

golang json 옵션

by LibRat 2025. 2. 2.
반응형

Go의 encoding/json 패키지 쓸 때 구조체 필드에 태그 붙여서 JSON 직렬화, 역직렬화 동작 제어 가능함


기본 문법

구조체 필드에 JSON 태그 지정하는 법임

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

이렇게 하면 JSON 변환 시 {"name": "Alice", "age": 30} 같이 나옴


주요 옵션들

  1. 필드 이름 지정

    • json:"필드명": JSON 인코딩할 때 쓸 필드 이름 지정함

      type Person struct {
          FullName string `json:"name"`
      }
  2. omitempty

    • omitempty: 필드 값이 타입의 제로 값이면 JSON 결과에 안 들어감

      type Person struct {
          Name    string `json:"name"`
          Age     int    `json:"age,omitempty"`
          Address string `json:"address,omitempty"`
      }

      예를 들어 Age가 0이거나 Address가 빈 문자열이면 해당 필드 JSON에 빠짐

  3. - (대시 기호)

    • -: 이 필드는 JSON 인코딩/디코딩 때 아예 무시됨

      type Person struct {
          Name   string `json:"name"`
          Secret string `json:"-"`
      }

      위 코드 보면 Secret 필드는 JSON 결과에 안 들어감

  4. string 옵션

    • string: 숫자나 불리언 같은 값을 JSON 문자열로 인코딩/디코딩 하도록 함

      type Number struct {
          Value int `json:"value,string"`
      }

      예를 들어 Value가 123이면 JSON에 "123"처럼 문자열로 표현됨

  5. 다중 옵션 사용

    • 옵션은 쉼표(,)로 구분해서 여러 개 쓸 수 있음

      type Person struct {
          Name string `json:"name,omitempty"`
      }

주의사항

  • 대소문자: Go는 공개(Exported) 필드(대문자 시작)만 JSON 인코딩/디코딩 대상임. 비공개 필드(소문자 시작)는 태그 있어도 무시됨
  • 기본 이름 변환: 태그 없으면 필드 이름 그대로 JSON 키로 쓰이는데, 첫 글자만 소문자로 바뀜
  • 구조체 임베딩: 임베디드 구조체(익명 필드)는 태그 없이도 JSON에 포함됨. 필요하면 태그 써서 커스터마이징 가능함

예제

아래 예제는 위 옵션들 활용하는 예임

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name   string `json:"name"`          // JSON 키 "name"
    Age    int    `json:"age,omitempty"` // 값이 0이면 생략됨
    Secret string `json:"-"`             // JSON에 안 들어감
    Score  int    `json:"score,string"`  // 숫자를 문자열로 인코딩함
}

func main() {
    p := Person{
        Name:   "Alice",
        Age:    0,
        Secret: "loves chocolate",
        Score:  100,
    }

    data, err := json.Marshal(p)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

실행 결과는

{"name":"Alice","score":"100"}
  • Age 필드는 0이니까 omitempty 옵션 때문에 생략됨
  • Secret 필드는 json:"-" 옵션 때문에 아예 포함 안 됨
  • Score 필드는 숫자지만 JSON에서는 문자열 "100"으로 인코딩됨

이렇게 Go의 encoding/json 패키지에서 태그 옵션 써서 JSON 인코딩/디코딩 동작 세밀하게 제어할 수 있음

반응형