フィールドに一貫性がない可能性がある場合、JSON のアンマーシャリングは困難になる可能性があります。文字列または文字列の配列のいずれか。この不一致によりアンマーシャリング エラーが発生し、アプリケーションが失敗する可能性があります。
生の JSON データ キャプチャを使用する
json.RawMessage データを利用するさまざまな JSON フィールドを生データとしてキャプチャする構造。さらに、json の「-」名タグを利用して、最初のデコード段階でフィールドを非表示にします。
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
トップレベル JSON のアンマーシャル
トップレベルのアンマーシャルDisplayName を設定しないレベルの JSON 構造フィールド。
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
生の表示名を解析します
生データのタイプに応じて、表示名を適切な形式にアンマーシャリングします。
if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } // Join arrays with "&&" li.DisplayName = strings.Join(s, "&&") } }
ハンドルリストArray
前述のロジックをループに統合して、MyListings 構造内の MyListItem オブジェクトの配列を処理します。
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] // Parse raw display name if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } li.DisplayName = strings.Join(s, "&&") } } }
Encapsulate Logic
さまざまなタイプのフィールドが繰り返し発生する場合は、解析ロジックをカスタム タイプにカプセル化することを検討してください。 json.Unmarshaler インターフェイスを実装します。
配列値の処理
フィールド値を結合文字列ではなく文字列のスライスとして保持するには、それに応じて multiString 型を変更します。 .
これらの手法は、一貫性のない JSON フィールドを処理するための堅牢な方法を提供し、アンマーシャリングの成功と正確なデータを保証します。取得。
以上が一貫性のない文字列または配列の JSON フィールドを効率的にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。