Go での JSON の部分的なデコードと更新
JSON オブジェクトを操作する場合、不明な値を保持しながら特定の値のみをデコードする必要がある場合がありますオブジェクトの一部。ただし、Go のエンコーディング/json パッケージは構造体に存在しないフィールドを切り捨てる傾向があり、再エンコード時にデータ損失が発生します。
解決策
この問題を解決するには、単純な構造体と json.RawMessage の組み合わせを使用して不明なメッセージを保存できます。 field.
type Color struct { Space string raw map[string]json.RawMessage }
この構造体では、raw フィールドに JSON オブジェクト全体が RawMessage として保存されます。デコード時に、UnmarshalJSON メソッドは生のフィールドを読み取り、構造体の定義されたフィールドに特定の値を抽出します。
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 }
同様に、エンコード時に、MarshalJSON メソッドは Space フィールドをシリアル化し、エンコードされたバイトで生のマップを更新します。 .
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) }
このアプローチにより、特定のフィールドを維持しながら、部分的なデコードと更新が可能になります。 JSON オブジェクトの不明な部分。
以上が不明なフィールドを保持しながら、Go で JSON を部分的にデコードして更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。