Go 에서 JSON 이 자주 쓰 는 팁.
omitempty
type User struct{
Email string `json:"email,omitempty"`
Pwd string `json:"pwd,omitempty"`
}
type BlogPost struct{
URL string `json:"url"`
}
type Analytics struct{
Visitors int `json:"visitors"`
}
json.Marshal(struct{
*BlogPost
*Analytics
}{
post, analytics})
json.Unmarshal([]byte(`{
"url":"[email protected]",
"visitors":10
}`), struct{
*BlogPost
*Analytics
}{
&post, &analytics})
type Cache struct {
Key string `json:"key"`
MaxAge int `json:"cacheAge"`
}
json.Marshal(struct {
*Cache
OmitMaxAge int `json:"cacheAge,omitempty"` // remove bad key
MaxAge int `json:"max_age"` // add new key
}{
cache, 0, 10})
type Object struct {
Num int `json:"num,string"`
}
json {
"num":"100"}, json {
"num":100}
go 기본 값 은
time.Time
문자열 로 정렬 합 니 다.다른 방식 으로 표시 하려 면time.Time
형식 을 사용자 정의 하고 정의 해 야 합 니 다MarshalJSON
type timeImplMarshaler time.Time
func (o timeImplMarshaler) MarshalJSON() ([]byte, err) {
seconds := time.Time(o).Unix()
return []byte(strconv.FormatInt(seconds, 10)), nil
}
jsoniter 는 사용자 정의 type 이 아 닌 JSON 디 코딩 방식 을 정의 할 수 있 습 니 다.예 를 들 어
time.Time
에 대해 epoch int 64 직렬 화 를 사용 할 수 있 습 니 다.import "github.com/json-iterator/go/extra"
extra.RegisterTimeAsInt64Codec(time.Microsecond)
ouput, err := jsoniter.Marshal(time.Unix(1,1002))
should.Equal("1000001", string(output))
MarshalText
,UnmarshalText
비 문자열 을 key 로 지원 하 는 mapstring
key
의map
만 지원 하지만 go 는MarshalText()
인 터 페 이 스 를 통 해 다른 유형 도map
의key
로 사용 할 수 있 습 니 다.type Key struct {
Name string `json:"name"`
Value string `json:"value"`
}
// ( )
// json.Marshal()
func (k Key) MarshalText() ([]byte, error) {
data := fmt.Sprintf("%v_%v", k.Name, k.Value)
return []byte(data), nil
}
// ( ), .
// json.Unmarshal()
func (k *Key) UnmarshalText(text []byte) (error) {
tokens := strings.Split(string(text), "_")
if len(tokens) == 2 {
k.Name = tokens[0]
k.Value = tokens[1]
return nil
}
return errors.New("invalid text")
}
func main() {
val := map[Key]string{
{
"12", "22"}: "2"}
data, err := json.Marshal(val)
fmt.Println(string(data), err)
var vv map[Key]string
json.Unmarshal(data, &vv)
fmt.Println(vv)
}
[]byte
하여 저장 할 수 있 습 니 다.type RawObject struct {
Key string
Raw json.RawMessage
}
func main() {
var data RawObject
json.Unmarshal([]byte(`{"key":"111", "raw":[1,2,3]}`), &data)
fmt.Println(string(data.Raw)) // [1,2,3]
}
interface
에 대응 하 는 숫자 라면float64
형식 입 니 다.입력 한 숫자 가 크 면 정밀도 가 손 상 됩 니 다.UseNumber()
사용json.Number
을 사용 하여 문자열 로 숫자 를 표시 할 수 있 습 니 다.field tag
로 수정 할 수 있 습 니 다.② 그러나 한 필드 씩 설정 하 는 것 은 너무 번 거 로 우 므 로 jsoniter 를 사용 하면 이름 스타일 을 통일 적 으로 설정 할 수 있 습 니 다.
①,② 의 방식 으로 JSON 의 필드 이름 을 선택 합 니 다.① 의 필드 이름 이 존재 할 경우 ① 을 사용 합 니 다.그렇지 않 으 면 다시 사용 합 니 다 ②
type T struct {
UserName string
FirstLanguage string `json:"language"`
}
extra.SetNamingStrategy(func(s string) string {
return strings.ToLower(s)
})
d, _ := jsoniter.Marshal(T{
})
fmt.Println(string(d)) // {"username":"","language":""}
SupportPrivateFields()
를 사용 하여 열 어야 합 니 다.type T struct {
UserName string
FirstLanguage string `json:"language"`
private string
}
extra.SetNamingStrategy(func(s string) string {
return strings.ToLower(s)
})
extra.SupportPrivateFields()
var val T
jsoniter.Unmarshal([]byte(`{
"username":"",
"language":"en",
"private":"private"
}`), &val)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang과 DB를 연결하여 주가 데이터를 그래프로 표시합니다.진화 제작된 프로그램. 지난번에 한 품종에 집중되어 데이터를 보였는데, 이번에는 텍스트 상자에 입력한 품종 코드를 바탕으로 나는 도표를 표시하는 기능을 만들고 싶다. html에서 텍스트 상자와 단추를 준비하세요. w...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.