>백엔드 개발 >Golang >이중 역마샬링 없이 Go에서 JSON을 구문 분석하는 방법은 무엇입니까?

이중 역마샬링 없이 Go에서 JSON을 구문 분석하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-26 15:58:141008검색

How to Parse JSON in Go Without Double Unmarshaling?

Go에서 이중 역마샬링 없이 JSON 구문 분석

Go에서는 별도의 작업 없이 다양한 유형의 JSON 데이터를 구문 분석하려는 상황에 직면할 수 있습니다. 두 번 언마샬링합니다. 관련된 단계를 살펴보겠습니다.

1단계: 일반 맵으로 비정렬화

언급한 것처럼 첫 번째 단계는 JSON을 일반 맵으로 비정렬화하는 것입니다.[string ]인터페이스{}. 이는 키가 문자열이고 값이 다양한 데이터 구조를 보유할 수 있는 동적 인터페이스 유형인 맵과 유사한 구조를 제공합니다.

2단계: 키 및 값 유형 식별

맵이 있으면 이를 반복하여 관심 있는 키를 찾으세요. 값 유형에 따라 다음 단계를 진행할 수 있습니다. steps.

3단계: 알려진 유형을 직접 처리

값 유형이 알려진 구조체인 경우 이를 직접 캐스팅하여 원하는 구조체로 사용할 수 있습니다. 예를 들어 Ping 구조체가 있는 경우 맵 값이 Ping으로 캐스팅 가능한지 확인할 수 있습니다. 이는 JSON 필드 이름이 구조체 필드 이름과 일치하고 데이터 유형이 호환되는 경우에 잘 작동합니다.

4단계: 알 수 없는 유형에 대한 대체 접근 방식

값 유형이 알려지지 않았거나 사전 정의된 구조체와 호환되지 않는 경우 다음을 사용할 수 있습니다. 접근 방식:

  1. json.Marshal을 사용하여 인터페이스의 값을 다시 JSON으로 마샬링합니다.
  2. json.Unmarshal을 사용하여 JSON을 원하는 구조체로 역마샬링합니다.

부분 개선 역마샬링

이중 역마샬링이 필요하지 않도록 인터페이스{} 대신 json.RawMessage로 값을 역마샬링하여 데이터를 부분적으로 역마샬링할 수 있습니다. json.RawMessage는 원시 JSON 값을 나타내며 나중에 원하는 구조체로 직접 역마샬링될 수 있습니다.

코드 예제

제공된 예제에서 코드는 다음과 같습니다.

var myMap map[string]json.RawMessage

...

switch k {
    case "ping":
        // ...
    case "ack":
        err = json.Unmarshal(v, &myAck)
}

이 접근 방식은 값 유형이 알려져 있습니다. 그러나 다양한 경우를 처리하려면 여전히 스위치 문을 작성해야 합니다.

위 내용은 이중 역마샬링 없이 Go에서 JSON을 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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