ホームページ  >  記事  >  バックエンド開発  >  Golang の json.Unmarshal は、フィールドが JSON に存在しない場合、ポインター値を明示的に nil に設定しません。

Golang の json.Unmarshal は、フィールドが JSON に存在しない場合、ポインター値を明示的に nil に設定しません。

WBOY
WBOY転載
2024-02-09 08:12:08786ブラウズ

如果 JSON 中不存在该字段,Golang 的 json.Unmarshal 不会显式将指针值设置为 nil

PHP エディタ Zimo の紹介によると、Golang の json.Unmarshal が JSON データを解析する際、フィールドが JSON に存在しない場合、ポインタ値は明示的に nil に設定されません。 。つまり、JSON にフィールドが欠落している場合でも、ポインターは元の値を保持しており、プログラムでエラーや例外が発生する可能性があります。したがって、json.Unmarshal を使用する場合は、プログラムの安定性と正確性を確保するために欠落フィールドの処理に特別な注意を払う必要があります。

質問の内容

次の例を考えてみましょう:

リーリー

どの出力:

リーリー

初めて json.Unmarshal を実行すると、StructB が応答に表示され、正しくアンマーシャリングされます。しかし、これを 2 回目に行うと、フィールドが応答に表示されない場合、明示的に nil に設定されないようです。このフィールドが設定されていない構造体でこれを実行すると、それは nil に設定されます (または、明らかに何かに設定されていません) (3 番目の例に示すように)。

struct_b を非 nil に設定した場合、struct_b フィールドを含まない JSON 文字列を解析するときに 2 番目の json.Unmarshal StructB を明示的に nil に設定しますか?

解決策

それはできません。 json.Unmarshal 入力 JSON で表されていない構造フィールドは変更されません。空の構造体から始めるか、Unmarshal を呼び出す前にフィールドを任意の値に設定します (JSON 入力にない場合)。

以上がGolang の json.Unmarshal は、フィールドが JSON に存在しない場合、ポインター値を明示的に nil に設定しません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。