백엔드 개발 Golang Go에서 Json을 사용하는 방법을 가르쳐주세요.

Go에서 Json을 사용하는 방법을 가르쳐주세요.

Dec 28, 2021 pm 03:44 PM
언어로 가다

이 글은 golang튜토리얼 칼럼에서 Go 언어로 Json을 사용하는 방법을 소개하는 글입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

Encode

객체를 JSON 데이터로 인코딩하고, 인터페이스{} 객체를 허용하고, []byte를 반환하고 error: JSON数据,接受一个interface{}对象,返回[]byteerror

func Marshal(v interface{}) ([]byte, error)
로그인 후 복사

Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:

  • bool类型 转换为JSONBoolean

  • 整数,浮点数等数值类型 转换为JSONNumber

  • string 转换为JSON的字符串(带””引号)

  • struct 转换为JSONObject,再根据各个成员的类型递归打包

  • 数组或切片 转换为JSONArray

  • []byte 会先进行base64编码然后转换为JSON字符串

  • map转换为JSONObjectkey必须是string

  • interface{} 按照内部的实际类型进行转换

  • nil 转为JSONnull

  • 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 Objectkey打包成JSONUnmashal时,会自动匹配对应的变量名进行赋值,大小写不敏感。

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类型,使用时需要再手动转换为需要的intint64等类型。第二个是JSONobject自动转换为map[string]interface{}类型,访问时直接用JSON ``Object的字段名作为key进行访问。再不知道JSON数据的格式时,可以使用interface{}

type Marshaler interface { 
 MarshalJSON() ([]byte, error) } type Unmarshaler interface { 
 UnmarshalJSON([]byte) error 
}
로그인 후 복사
로그인 후 복사
Marshal 함수는 전체 객체를 재귀적으로 순회하고 멤버 유형별로 객체를 차례로 인코딩합니다. 유형 변환 규칙은 다음과 같습니다. 🎜
    🎜bool 유형은 JSONBoolean🎜
  • 🎜정수, 부동 소수점 및 기타 숫자로 변환됩니다. 유형은 JSON숫자🎜
  • 🎜string으로 변환됩니다. JSON ("" 따옴표 포함) 🎜
  • 🎜structJSONObject로 변환된 후 재귀적으로 각 멤버의 유형에 따라 패키징🎜
  • 🎜JSONArray🎜
  • 🎜로 변환된 배열 또는 슬라이스 []byte는 먼저 base64 인코딩을 처리한 다음 JSON 문자열 🎜
  • 🎜map는 <code>JSON >Object로 변환됩니다. keystring🎜
  • 🎜인터페이스{} 실제 내부 유형에 따라 🎜
  • 🎜nilJSON로 변환합니다. null🎜
  • 🎜channel , func 및 기타 유형은 UnsupportedTypeError🎜
  • rrreee🎜🎜🎜🎜Decode🎜🎜🎜는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? Apr 02, 2025 pm 02:06 PM

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

Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Apr 02, 2025 pm 02:09 PM

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

GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? Apr 02, 2025 pm 04:12 PM

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

GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? Apr 02, 2025 pm 12:57 PM

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

이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? 이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? Apr 02, 2025 pm 02:03 PM

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

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? 골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Apr 02, 2025 pm 05:09 PM

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

Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Apr 02, 2025 pm 04:54 PM

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

Go 및 Viper 라이브러리를 사용할 때 포인터를 전달 해야하는 이유는 무엇입니까? Go 및 Viper 라이브러리를 사용할 때 포인터를 전달 해야하는 이유는 무엇입니까? Apr 02, 2025 pm 04:00 PM

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

See all articles