>  기사  >  백엔드 개발  >  Golang 객체를 json으로

Golang 객체를 json으로

WBOY
WBOY원래의
2023-05-10 09:00:361106검색

golang에서 객체를 json으로 변환하는 것은 매우 일반적인 일이므로 대부분의 golang 개발자가 이를 접하게 될 것입니다. 이 기사에서는 golang에서 객체를 json으로 변환하는 방법과 기술을 공유합니다.

  1. encoding/json 패키지 사용하기

먼저 golang 표준 라이브러리에서 제공하는 인코딩/json 패키지를 살펴보겠습니다. 이 패키지는 객체를 json 형식의 문자열로 쉽게 변환하거나 json 형식의 문자열을 객체로 변환할 수 있는 매우 간단하고 사용하기 쉬운 함수와 유형을 제공합니다.

객체는 내보낼 수 있어야 합니다(즉, 첫 글자는 대문자로 표기). 그렇지 않으면 json 패키지가 해당 필드에 액세스할 수 없습니다.

다음은 인코딩/json 패키지를 사용하여 Student 개체를 json 형식 문자열로 변환하는 간단한 예제 코드입니다.

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name  string
    Age   int
    Score float64
}

func main() {
    s := Student{
        Name:  "Tom",
        Age:   18,
        Score: 90.5,
    }
    b, err := json.Marshal(s)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Println(string(b))
}

출력:

{"Name":"Tom","Age":18,"Score":90.5}

보시다시피 json 패키지에서 제공하는 Marshal 함수는 직렬화할 수 있습니다. JSON 형식 문자열의 구조 개체입니다.

복잡한 객체의 경우 json 형식 문자열로 쉽게 직렬화할 수도 있습니다. 예를 들어 다음 배열은 여러 Student 개체로 구성됩니다.

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name  string
    Age   int
    Score float64
}

func main() {
    students := []Student{
        {Name: "Tom", Age: 18, Score: 90.5},
        {Name: "Jerry", Age: 19, Score: 96.5},
        {Name: "Alice", Age: 17, Score: 85.5},
    }
    b, err := json.Marshal(students)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Println(string(b))
}

Output:

[{"Name":"Tom","Age":18,"Score":90.5},{"Name":"Jerry","Age":19,"Score":96.5},{"Name":"Alice","Age":17,"Score":85.5}]

마찬가지로 json 패키지에서 제공하는 Unmarshal 함수를 사용하여 json 형식 문자열을 개체로 구문 분석할 수 있습니다. 예:

package main

import (
    "encoding/json"
    "fmt"
)

type Point struct {
    X int `json:"x"`
    Y int `json:"y"`
}

type Line struct {
    Start Point `json:"start"`
    End   Point `json:"end"`
}

func main() {
    jsonStr := `
    {
        "start": {
            "x": 1,
            "y": 2
        },
        "end": {
            "x": 3,
            "y": 4
        }
    }`
    var line Line
    err := json.Unmarshal([]byte(jsonStr), &line)
    if err != nil {
        fmt.Println("json.Unmarshal failed:", err)
        return
    }
    fmt.Printf("%#v
", line)
}

출력:

main.Line{Start:main.Point{X:1, Y:2}, End:main.Point{X:3, Y:4}}

이 샘플 코드에서는 두 개의 Point 개체가 포함된 Line 개체를 정의합니다. json 패키지에서 제공하는 Unmarshal 함수를 사용하여 json 형식 문자열을 Line 객체로 구문 분석한 후 출력합니다.

  1. 구조 태그를 통한 맞춤형 json 직렬화 및 역직렬화

필드 이름 수정 등 json 형식으로 출력을 맞춤화하려면 어떻게 해야 하나요? 이때 golang의 struct 태그가 유용합니다.

golang에서 구조체 태그는 구조체 필드에 주석을 다는 방법으로, 필드 유형 뒤에 문자열을 추가하면 됩니다. json 패키지 직렬화 및 역직렬화를 사용할 때 구조체 태그를 사용하여 직렬화 및 역직렬화 프로세스를 제어할 수 있습니다.

다음은 구조체 태그를 사용하여 json 직렬화 및 역직렬화 프로세스를 제어하는 ​​방법을 보여주는 간단한 샘플 코드입니다.

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Score float64
}

func main() {
    s := Student{
        Name:  "Tom",
        Age:   18,
        Score: 90.5,
    }
    fmt.Println("*** 序列化 ***")
    b, err := json.Marshal(s)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Println(string(b))

    fmt.Println("*** 反序列化 ***")
    jsonStr := `{"name":"Tom","age":18,"Score":90.5}`
    var student Student
    err = json.Unmarshal([]byte(jsonStr), &student)
    if err != nil {
        fmt.Println("json.Unmarshal failed:", err)
        return
    }
    fmt.Printf("%#v
", student)
}

출력:

*** 序列化 ***
{"name":"Tom","age":18,"Score":90.5}
*** 反序列化 ***
main.Student{Name:"Tom", Age:18, Score:90.5}

여기에서는 Student 개체의 Name 필드를 "name"으로 표시합니다. json.Marshal 함수를 사용하여 직렬화하면 이름이 "name"으로 변경됩니다. 마찬가지로 json.Unmarshal 함수를 사용하여 역직렬화하면 "name"이 자동으로 Name 필드로 인식됩니다.

구조체 태그 형식을 통해 json 출력에서 ​​필드의 가시성을 제어할 수도 있습니다. 예:

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name  string `json:"name,omitempty"`
    Age   int    `json:"age"`
    Score float64
}

func main() {
    s := Student{
        Age:   18,
        Score: 90.5,
    }
    fmt.Println("*** 序列化 ***")
    b, err := json.Marshal(s)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Println(string(b))

    fmt.Println("*** 反序列化 ***")
    jsonStr := `{"name":"Tom","age":18,"Score":90.5}`
    var student Student
    err = json.Unmarshal([]byte(jsonStr), &student)
    if err != nil {
        fmt.Println("json.Unmarshal failed:", err)
        return
    }
    fmt.Printf("%#v
", student)
}

Output:

*** 序列化 ***
{"age":18,"Score":90.5}
*** 反序列化 ***
main.Student{Name:"Tom", Age:18, Score:90.5}

여기서 Name 필드를 "omitempty"로 표시합니다. 즉, Name 필드의 값이 0(예: "")인 경우 json을 출력할 때 이 필드가 무시됩니다.

  1. 타사 라이브러리 사용

더 복잡한 json 직렬화 및 역직렬화를 수행해야 하는 경우 golang 표준 라이브러리가 약간 약할 수 있습니다. 현재로서는 일부 타사 라이브러리를 사용하여 보다 유연한 작업을 달성할 수 있습니다.

다음은 json 직렬화 및 역직렬화를 위해 타사 라이브러리를 사용하는 샘플 코드입니다. 이 샘플 코드는 현재 가장 빠른 golang json 라이브러리 중 하나인 json-iterator/go 패키지를 사용합니다.

package main

import (
    "fmt"
    "github.com/json-iterator/go"
)

type Student struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Score float64 `json:"score,omitempty"`
}

func main() {
    student := Student{
        Name:  "Tom",
        Age:   18,
        Score: 0,
    }
    fmt.Println("*** 序列化 ***")
    json := jsoniter.ConfigCompatibleWithStandardLibrary
    b, err := json.Marshal(student)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Println(string(b))

    fmt.Println("*** 反序列化 ***")
    jsonStr := `{"name":"Tom","age":18}`
    err = json.Unmarshal([]byte(jsonStr), &student)
    if err != nil {
        fmt.Println("json.Unmarshal failed:", err)
        return
    }
    fmt.Printf("%#v
", student)
}

출력:

*** 序列化 ***
{"name":"Tom","age":18}
*** 反序列化 ***
main.Student{Name:"Tom", Age:18, Score:0}

타사 라이브러리를 사용하면 더 유연한 json 작업을 달성할 수 있지만 성능 저하 또는 코드 복잡성 증가와 같은 문제가 발생할 수도 있으므로 특정 시나리오에 따라 선택해야 한다는 점에 유의해야 합니다.

이 글은 golang에서 객체를 json으로 변환하는 몇 가지 방법과 기술을 소개합니다. 이 글이 독자들에게 도움이 되기를 바랍니다.

위 내용은 Golang 객체를 json으로의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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