Go에서 Json을 사용하는 방법을 가르쳐주세요.
이 글은 golang튜토리얼 칼럼에서 Go 언어로 Json을 사용하는 방법을 소개하는 글입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
Encode
객체를 JSON
데이터로 인코딩하고, 인터페이스{}
객체를 허용하고, []byte
를 반환하고 error: JSON
数据,接受一个interface{}
对象,返回[]byte
和error
:
func Marshal(v interface{}) ([]byte, error)
Marshal
函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:
bool
类型 转换为JSON
的Boolean
整数,浮点数等数值类型 转换为
JSON
的Number
string
转换为JSON
的字符串(带””引号)struct
转换为JSON
的Object
,再根据各个成员的类型递归打包数组或切片 转换为
JSON
的Array
[]byte
会先进行base64
编码然后转换为JSON
字符串map
转换为JSON
的Object
,key
必须是string
interface{}
按照内部的实际类型进行转换nil
转为JSON
的null
channel
,func
等类型 会返回UnsupportedTypeError
type ColorGroup struct { ID int Name string Colors []string } group := ColorGroup{ ID: 1, Name: "Reds", Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
Decode
将JSON
数据解码
func Unmarshal(data []byte, v interface{}) error
类型转换规则和上面的规则类似
var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll", "Order": "Dasyuromorphia"} ]`) type Animal struct { Name string Order string } var animals []Animal err := json.Unmarshal(jsonBlob, &animals) if err != nil { fmt.Println("error:", err) } fmt.Printf("%+v", animals) Output: [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]
结构体
结构体必须是大写字母开头的成员才会被JSON
处理到,小写字母开头的成员不会有影响。
Mashal
时,结构体的成员变量名将会直接作为JSON
Object
的key
打包成JSON
;Unmashal
时,会自动匹配对应的变量名进行赋值,大小写不敏感。
Unmarshal
时,如果JSON
中有多余的字段,会被直接抛弃掉;如果JSON
缺少某个字段,则直接忽略不对结构体中变量赋值,不会报错。
type Message struct { Name string Body string Time int64 inner string } var m = Message{ Name: "Alice", Body: "Hello", Time: 1294706395881547000, inner: "ok", } b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`) err := json.Unmarshal(b, &m) if err != nil { fmt.Printf(err.Error()) return} fmt.Printf("%v", m) Output: {Bob Hello 1294706395881547000 ok}
StructTag
如果希望手动配置结构体的成员和JSON
字段的对应关系,可以在定义结构体的时候给成员打标签:
使用omitempty
熟悉,如果该字段为nil
或0值(数字0,字符串””,空数组[]等),则打包的JSON
结果不会有这个字段。
type Message struct { Name string `json:"msg_name"` // 对应JSON的msg_name Body string `json:"body,omitempty"` // 如果为空置则忽略字段 Time int64 `json:"-"` // 直接忽略字段 } var m = Message{ Name: "Alice", Body: "", Time: 1294706395881547000, } data, err := json.Marshal(m) if err != nil { fmt.Printf(err.Error()) return} fmt.Println(string(data)) Output: {"msg_name":"Alice"}
更灵活地使用JSON
使用json.RawMessage
json.RawMessage
其实就是[]byte
类型的重定义。可以进行强制类型转换。
现在有这么一种场景,结构体中的其中一个字段的格式是未知的:
type Command struct { ID int Cmd string Args *json.RawMessage }
使用json.RawMessage
的话,Args
字段在Unmarshal
时不会被解析,直接将字节数据赋值给Args
。我们可以能先解包第一层的JSON
数据,然后根据Cmd
的值,再确定Args
的具体类型进行第二次Unmarshal
。
这里要注意的是,一定要使用指针类型*json.RawMessage
,否则在Args
会被认为是[]byte
类型,在打包时会被打包成base64
编码的字符串。
使用interface{}
interface{}
类型在Unmarshal
时,会自动将JSON
转换为对应的数据类型:
JSON的boolean 转换为boolJSON的数值 转换为float64JSON的字符串 转换为stringJSON的Array 转换为[]interface{}JSON的Object 转换为map[string]interface{}JSON的null 转换为nil
需要注意的有两个。一个是所有的JSON
数值自动转换为float64
类型,使用时需要再手动转换为需要的int
,int64
等类型。第二个是JSON
的object
自动转换为map[string]interface{}
类型,访问时直接用JSON ``Object
的字段名作为key
进行访问。再不知道JSON
数据的格式时,可以使用interface{}
type Marshaler interface { MarshalJSON() ([]byte, error) } type Unmarshaler interface { UnmarshalJSON([]byte) error }
Marshal
함수는 전체 객체를 재귀적으로 순회하고 멤버 유형별로 객체를 차례로 인코딩합니다. 유형 변환 규칙은 다음과 같습니다. 🎜- 🎜
- 🎜정수, 부동 소수점 및 기타 숫자로 변환됩니다. 유형은
JSON
의숫자
🎜 - 🎜
string
으로 변환됩니다.JSON ("" 따옴표 포함) 🎜
- 🎜
struct
는JSON
의Object
로 변환된 후 재귀적으로 각 멤버의 유형에 따라 패키징🎜 - 🎜
JSON
의Array
🎜 - 🎜로 변환된 배열 또는 슬라이스
[]byte
는 먼저base64
인코딩을 처리한 다음JSON
문자열 🎜 - 🎜
map는 <code>JSON
의>Object
로 변환됩니다.key
는string
🎜 - 🎜
인터페이스{}
실제 내부 유형에 따라 🎜 - 🎜
nil
을JSON
의로 변환합니다. null
🎜 - 🎜
channel
,func
및 기타 유형은UnsupportedTypeError
🎜 rrreee🎜🎜🎜🎜Decode🎜🎜🎜는
bool
유형은 JSON
의 Boolean
🎜JSON 코드>데이터 디코딩🎜rrreee🎜유형 변환 규칙은 위의 규칙과 유사합니다.🎜rrreee🎜🎜🎜🎜Structure🎜🎜🎜구조는 다음과 같아야 합니다. <code>JSON
에서 처리할 대문자로 시작하는 멤버, 문자로 시작하는 소문자 멤버는 아무런 효과가 없습니다. 🎜🎜Mashal
, 구조체의 멤버 변수 이름은 JSON
Objectkey
로 에 직접 패키징됩니다. /code> >JSON
; Unmashal
은 할당을 위해 해당 변수 이름을 자동으로 일치시키며 대소문자를 구분하지 않습니다. 🎜🎜Unmarshal
할 때 JSON
에 추가 필드가 있는 경우 JSON
에 필드가 없으면 해당 필드가 바로 삭제됩니다. 직접 무시됩니다. 구조의 변수에 값을 할당하지 않으면 오류가 보고되지 않습니다. 🎜rrreee🎜🎜🎜🎜StructTag🎜🎜🎜구조 멤버와 JSON
필드 간의 대응 관계를 수동으로 구성하려는 경우 구조를 정의할 때 멤버에 태그를 지정할 수 있습니다. 🎜🎜 생략은 익숙합니다. 필드가 nil
이거나 0 값(숫자 0, 문자열 "", 빈 배열 [] 등)인 경우 압축된 JSON code> result 해당 필드는 없습니다. 🎜rrreee🎜더 유연하게 <code>JSON
사용🎜🎜🎜🎜🎜json.RawMessage🎜🎜🎜json.RawMessage
사용은 실제로 []byte
유형입니다. 재정의. 캐스팅이 가능합니다. 🎜🎜이제 구조의 필드 중 하나의 형식을 알 수 없는 시나리오가 있습니다. 🎜rrreee🎜 json.RawMessage
를 사용하는 경우 Args
필드는 Unmarshal
은 구문 분석되지 않으며 바이트 데이터는 Args
에 직접 할당됩니다. 먼저 JSON
데이터의 첫 번째 계층을 풀고 두 번째로 Cmd
값을 기반으로 Args
의 특정 유형을 결정할 수 있습니다. . 비정렬화
. 🎜🎜여기서 포인터 유형 *json.RawMessage
를 사용해야 한다는 점에 유의해야 합니다. 그렇지 않으면 Args
가 []byte
로 간주됩니다. > type 은 패키징 시 base64
인코딩된 문자열로 패키징됩니다. 🎜🎜🎜🎜🎜인터페이스{}🎜🎜🎜interface{}
유형을 사용하면 Unmarshal
유형을 입력할 때 자동으로 JSON
을 해당 데이터로 변환합니다. 🎜 rrreee🎜주의할 점은 두 가지입니다. 하나는 모든 JSON
값이 자동으로 float64
유형으로 변환된다는 점입니다. 사용 시 필수 int
로 수동으로 변환해야 합니다. int64 code> 및 기타 유형. 두 번째는 <code>JSON
의 객체
가 자동으로 map[string]interface{}
유형으로 변환되고, 를 사용하여 직접 액세스된다는 것입니다. >JSON `` Object
의 필드 이름은 key
로 액세스됩니다. JSON
데이터의 형식을 모르는 경우 인터페이스{}
를 사용할 수 있습니다. 🎜自定义类型
如果希望自己定义对象的打包解包方式,可以实现以下的接口:
type Marshaler interface { MarshalJSON() ([]byte, error) } type Unmarshaler interface { UnmarshalJSON([]byte) error }
实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json
在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。
위 내용은 Go에서 Json을 사용하는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

Go Pointer Syntax 및 Viper Library 사용의 문제 해결 GO 언어로 프로그래밍 할 때 특히 포인터의 구문 및 사용법을 이해하는 것이 중요합니다.
