> 백엔드 개발 > Golang > JSON 데이터를 golang의 지도 유형으로 변환하는 방법

JSON 데이터를 golang의 지도 유형으로 변환하는 방법

PHPz
풀어 주다: 2023-04-21 14:46:51
원래의
5449명이 탐색했습니다.

Golang에서는 JSON이 일반적인 데이터 교환 형식이기 때문에 JSON 데이터를 지도로 변환해야 하는 필요성도 매우 일반적입니다. 이번 글에서는 Golang을 이용하여 JSON 데이터를 지도형으로 변환하는 방법을 소개하겠습니다.

  1. 표준 라이브러리 unmarshal 함수 사용

Golang의 표준 라이브러리에는 JSON 관련 함수와 유형이 많이 포함되어 있으며, 그 중 가장 중요한 것은 json.Unmarshal 함수입니다. 이 함수는 JSON 데이터를 Go 언어 데이터 구조로 디코딩합니다.

이 함수를 사용하여 JSON 문자열을 지도로 변환할 수 있습니다. 먼저 JSON 디코딩 결과를 저장하는 데 사용되는 변수를 정의하고 JSON 문자열을 포함하는 바이트 배열을 만듭니다. 그런 다음 json.Unmarshal 함수를 호출하여 JSON 문자열을 지도 유형으로 디코딩합니다.

예는 다음과 같습니다.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var data = []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    err := json.Unmarshal(data, &result)

    if err != nil {
        fmt.Println("JSON转换失败:", err)
        return
    }

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}
로그인 후 복사

위 코드에서는 JSON 디코딩 결과를 저장하기 위해 맵 유형 변수 결과를 정의합니다. JSON 문자열을 디코딩하기 위해 json.Unmarshal을 호출할 때 결과의 주소를 전달해야 합니다. 마지막으로 결과의 키-값 쌍을 반복하여 인쇄합니다. 출력은 다음과 같습니다.

name : Tom
age : 28
gender : male
로그인 후 복사
  1. 타사 라이브러리 easyjson 사용

Golang에는 easyjson이라는 타사 JSON 직렬화 라이브러리도 있는데, 이 라이브러리를 사용하면 JSON을 Go 언어의 데이터 유형으로 더 편리하게 변환할 수 있습니다. 표준 라이브러리 json.Unmarshal과 달리 easyjson은 코드 생성을 사용하여 구문 분석 효율성을 향상시킵니다. 또한 JSON을 인라인 유형으로 구문 분석하거나 고속 반복과 같은 고급 기능을 지원합니다.

easyjson을 사용하려면 라이브러리를 설치하고 Go 코드에 생성된 코드를 포함해야 합니다. 먼저 easyjson을 설치하세요.

go get github.com/mailru/easyjson
로그인 후 복사

다음으로 JSON으로 변환해야 하는 데이터 유형에 대한 easyjson 템플릿을 정의하세요. easyjson 템플릿은 여러 파일로 구성되며 각 파일에는 .go 파일과 _easyjson.go 파일이 있습니다.

다음은 easyjson 템플릿을 사용하여 JSON 문자열을 지도로 변환하는 샘플 코드입니다.

package main

import (
    "fmt"

    "github.com/mailru/easyjson/jlexer"
    "github.com/mailru/easyjson/jwriter"
)

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

func main() {
    data := []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    r := jlexer.Lexer{Data: data}
    result = parseMap(&r)

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}

func parseMap(r *jlexer.Lexer) map[string]interface{} {
    result := map[string]interface{}{}
    for {
        key := r.String()
        r.WantColon()
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result[key] = parseMap(r)
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result[key] = parseArray(r)
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result[key] = r.Int()
        case jlexer.String:
            result[key] = r.String()
        case jlexer.Null:
            result[key] = nil
        case jlexer.True:
            result[key] = true
        case jlexer.False:
            result[key] = false
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}

func parseArray(r *jlexer.Lexer) []interface{} {
    result := []interface{}{}
    for {
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result = append(result, parseMap(r))
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result = append(result, parseArray(r))
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result = append(result, r.Int())
        case jlexer.String:
            result = append(result, r.String())
        case jlexer.Null:
            result = append(result, nil)
        case jlexer.True:
            result = append(result, true)
        case jlexer.False:
            result = append(result, false)
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}
로그인 후 복사

위 코드에서는 JSON 문자열의 데이터를 나타내기 위해 Person이라는 구조를 정의합니다. 그런 다음 읽기 쉬운 형식으로 JSON 문자열을 만듭니다.

메인 함수에서는 jlexer.Lexer를 사용하여 JSON 데이터를 ParseMap 함수에 전달하고 결과를 지도 유형 변수 result에 저장합니다. 마지막으로 맵의 키-값 쌍의 내용을 인쇄합니다.

이 예에서는 JSON 문자열을 디코딩하는parseMap 함수를 직접 작성했습니다. 이 함수는 JSONLexer를 읽고 자신을 재귀적으로 호출하여 JSON 문자열을 구문 분석합니다. 마지막으로 파싱된 결과의 지도 객체를 반환합니다.

easyjson에서 제공하는 디코더를 사용하면 복잡한 JSON 구조를 쉽게 구문 분석할 수 있지만, 대량의 데이터를 맵으로 디코딩해야 하는 경우 구문 분석 효율성이 떨어질 수 있습니다.

결론

JSON 데이터를 Golang의 지도로 변환하는 방법에는 여러 가지가 있습니다. 표준 라이브러리는 JSON 데이터를 맵으로 직접 디코딩할 수 있는 json.Unmarshal을 제공합니다. 타사 라이브러리 easyjson은 보다 효율적인 솔루션을 제공하지만 더 많은 설정과 구성이 필요합니다.

특정 상황에 따라 적절한 솔루션을 선택하세요. 간단한 JSON 문자열만 디코딩해야 하는 경우 표준 라이브러리를 사용할 수 있습니다. 대량의 데이터나 더 복잡한 구조를 디코딩해야 하는 경우 타사 라이브러리 easyjson을 사용할 수 있습니다.

위 내용은 JSON 데이터를 golang의 지도 유형으로 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿