Go에서 부분 JSON 디코딩 및 업데이트
특정 시나리오에서는 JSON 객체의 특정 값만 디코딩하고 업데이트할 때 일반적인 문제가 발생합니다. 특히 전체 개체 구조를 알 수 없는 경우에는 더욱 그렇습니다. Go의 표준 인코딩/json 패키지는 구조체에 제공되지 않은 필드를 잘라 데이터 손실을 초래합니다.
json.RawMessage를 사용하는 솔루션
이 문제에 대한 솔루션은 다음과 같습니다. 사용자 정의 구조체를 json.RawMessage와 결합합니다. 이 접근 방식을 사용하면 인코딩/디코딩을 위해 전체 데이터를 원시 필드에 보존할 수 있습니다.
Go의 json.RawMessage 유형은 임의의 JSON 데이터를 보유할 수 있는 []byte 값입니다. JSON 구조의 일부만 알고 알 수 없는 부분은 보존하려는 경우에 유용합니다.
예제 코드
package main import ( "encoding/json" "log" ) 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 } 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) } func main() { before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) log.Println("before: ", string(before)) // decode color := new(Color) err := json.Unmarshal(before, color) if err != nil { log.Fatal(err) } // modify fields of interest color.Space = "RGB" // encode after, err := json.Marshal(color) if err != nil { log.Fatal(err) } log.Println("after: ", string(after)) }
출력
before: {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}} after: {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
이 솔루션을 사용하면 특정 값만 디코딩하고 업데이트할 수 있습니다. (이 경우 Space) JSON 개체에 다른 모든 알 수 없는 데이터를 보존합니다. 이 접근 방식은 출력에서 키 순서나 들여쓰기를 유지하지 않는다는 점에 유의하는 것이 중요합니다.
위 내용은 Go에서 JSON 객체를 부분적으로 디코딩하고 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!