ホームページ > バックエンド開発 > Golang > 一貫性のない JSON フィールドを処理する方法: 文字列と配列?

一貫性のない JSON フィールドを処理する方法: 文字列と配列?

Barbara Streisand
リリース: 2024-12-05 03:51:13
オリジナル
210 人が閲覧しました

How to Handle Inconsistent JSON Fields: Strings vs. Arrays?

一貫性のない 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 つの手法を活用できます:

  1. json.RawMessage の利用: 問題のある部分をキャプチャする
  2. JSON "-" の使用 名前: JSON デコーダーで "DisplayName" フィールドを "-" として定義して、アンマーシャリング プロセスから除外します。

更新されましたコード:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート