ホームページ >バックエンド開発 >Golang >一貫性のない文字列または配列の JSON フィールドを効率的にアンマーシャリングするにはどうすればよいですか?

一貫性のない文字列または配列の JSON フィールドを効率的にアンマーシャリングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 14:53:14451ブラウズ

How Can I Efficiently Unmarshal Inconsistent String or Array JSON Fields?

柔軟な JSON フィールドのアンマーシャリング: 一貫性のない文字列または配列値の変換

問題

フィールドに一貫性がない可能性がある場合、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 サイトの他の関連記事を参照してください。

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