ホームページ  >  記事  >  バックエンド開発  >  json.Unmarshal ファイルのデータは有効ですが、json.NewDecoder().Decode() は無効です

json.Unmarshal ファイルのデータは有効ですが、json.NewDecoder().Decode() は無効です

WBOY
WBOY転載
2024-02-09 12:15:31816ブラウズ

json.Unmarshal 文件数据有效,但 json.NewDecoder().Decode() 无效

php editor Strawberry が JSON 解析に関する問題を紹介します。 json.Unmarshal を使用してファイル データを解析するのは効果的だが、json.NewDecoder().Decode() を使用すると効果的ではないという状況に遭遇することがあります。この問題は、コードロジックまたはデータ形式で発生する可能性がありますので、以下で考えられる原因を詳細に分析し、解決策を提供します。

質問の内容

以下は構造を正しくアンマーシャリングします:

リーリー

しかし、これは機能せず、多数の古典的な JSON 解析エラー (eof予期しないトークン 't' など) がスローされます。

リーリー ###なぜなのかご存知ですか?

os.file または []byte は 2 つのゴルーチンで同時に使用されており、json 構造は次のとおりです (一部のフィールドは省略されています):

func foo() {
  d, err := os.readfile("file.json")

  var t t
  if err := json.unmarshal(d, &t); err != nil {
    panic(err)
  }
}

Solution

os.File または []byte 2 つの goroutine で同時に使用します...

ここに問題があります。

os.File には、次の読み取りが行われる内部ファイル ポインターがあります。無関係な 2 つのエンティティが引き続きデータを読み取る場合、重複するデータを読み取れない可能性があります。最初のエンティティによって読み取られたバイトは、2 番目のエンティティでは繰り返されません。

さらに、

os.File は同時使用が安全ではありません (ドキュメントには安全であるとは明示されていません)。複数の同時ゴルーチンからそのメソッドを呼び出すと、データ競合が発生する可能性があります。

「読み取り」を行う複数の関数/ゴルーチンに

[]byte を渡す場合、共有ポインターやインデックス変数は存在しません。各関数/ゴルーチンはそのインデックスを個別に維持し、複数のゴルーチン (この場合はスライス ヘッダーとスライス要素のフィールド) から変数を読み取ることができます。

以上がjson.Unmarshal ファイルのデータは有効ですが、json.NewDecoder().Decode() は無効ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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