一貫性のない JSON フィールドの処理: 文字列と配列のケース
完全に一貫性がない JSON データを扱う場合、問題が発生する可能性がありますアンマーシャリングプロセス中。これは、JSON 内の特定のフィールドの形式が異なる場合に発生する可能性があり、アンマーシャリング プロセスに問題が生じます。
問題:
次のシナリオを考えてみましょう:
type MyListItem struct { Date string `json:"date"` DisplayName string `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` }
JSON データには「display_name」というフィールドがあり、これは文字列であることが期待されます。ただし、場合によっては、文字列の配列になることもあります。この不一致によりアンマーシャリング プロセスが複雑になり、エラーが発生します。
解決策:
この課題を克服するには、次の 2 つの手法を活用できます:
更新されましたコード:
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
JSON のアンマーシャリング:
トップレベル JSON のアンマーシャリング:
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
「DisplayName」の抽出" フィールドに応じてtype:
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, "&&") } }
例:
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] 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, "&&") } } }
これらの手法を採用することで、一貫性のない JSON フィールドを効果的に処理し、アプリケーションで適切なデータ抽出と操作を保証できます。 .
以上が一貫性のない JSON フィールドを処理する方法: 文字列と配列?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。