ホームページ >バックエンド開発 >Golang >不明なフィールドを保持しながら、Go で JSON を部分的にデコードして更新するにはどうすればよいですか?

不明なフィールドを保持しながら、Go で JSON を部分的にデコードして更新するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-31 10:28:10508ブラウズ

How Can I Partially Decode and Update JSON in Go While Preserving Unknown Fields?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。