> 백엔드 개발 > Golang > 알 수 없는 필드를 잃지 않고 Go에서 JSON 데이터를 부분적으로 디코딩하고 업데이트하는 방법은 무엇입니까?

알 수 없는 필드를 잃지 않고 Go에서 JSON 데이터를 부분적으로 디코딩하고 업데이트하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-24 20:44:17
원래의
682명이 탐색했습니다.

How to Partially Decode and Update JSON Data in Go Without Losing Unknown Fields?

Go에서 JSON 부분 디코딩 및 업데이트

JSON 데이터로 작업할 때 기존 구조를 잃지 않고 특정 값만 수정해야 하는 경우가 있습니다. Go의 인코딩/json 패키지는 대상 구조체에 포함되지 않은 필드를 자르기 때문에 JSON 개체의 전체 구조를 모른다면 이는 어려울 수 있습니다.

이 문서에서는 일반 구조체의 조합을 활용하는 기술을 살펴봅니다. 알 수 없는 정보를 잃지 않고 부분 디코딩 및 업데이트를 달성하기 위한 json.RawMessage.

부분 디코딩

부분 디코딩의 핵심 디코딩은 전체 JSON 데이터를 원시 필드(예: map[string]json.RawMessage)에 보관하고 특정 필드를 선택적으로 구조체로 역마샬링하는 것입니다. 수행 방법은 다음과 같습니다.

import "encoding/json"

type Color struct {
    Space string
    raw   map[string]json.RawMessage
}

func (c *Color) UnmarshalJSON(bytes []byte) error {
    if err := json.Unmarshal(bytes, &c.raw); err != nil {
        return err
    }
    if space, ok := c.raw["Space"]; ok {
        if err := json.Unmarshal(space, &c.Space); err != nil {
            return err
        }
    }
    return nil
}
로그인 후 복사

여기서 UnmarshalJSON은 전체 JSON 데이터를 c.raw로 검색한 다음 Space 필드를 c.Space로 역마샬링합니다.

알려진 필드 수정

JSON 데이터를 부분적으로 디코딩한 후에는 특정 필드를 다음과 같이 수정할 수 있습니다. 필요합니다.

마샬링 및 보존

알려진 필드를 수정한 후 업데이트된 Color 구조체를 다시 JSON으로 마샬링해야 합니다. 기존 구조를 유지하고 잘림을 방지하려면 사용자 정의 MarshalJSON 메서드를 작성합니다.

func (c *Color) MarshalJSON() ([]byte, error) {
    bytes, err := json.Marshal(c.Space)
    if err != nil {
        return nil, err
    }
    c.raw["Space"] = json.RawMessage(bytes)
    return json.Marshal(c.raw)
}
로그인 후 복사

MarshalJSON에서 수정된 Space 필드를 마샬링한 다음 최종 마샬링을 수행하기 전에 원시 맵에 다시 포함합니다.

결론

이 기술을 사용하면 알 수 없는 정보를 잃지 않고 JSON 데이터의 특정 값을 수정할 수 있으며, 전체 JSON 구조를 사용할 수 없거나 변경될 수 있는 시나리오에 적합합니다.

위 내용은 알 수 없는 필드를 잃지 않고 Go에서 JSON 데이터를 부분적으로 디코딩하고 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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