「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > IntTo Float64 の JSON 変換の謎

IntTo Float64 の JSON 変換の謎

2024 年 11 月 2 日に公開
ブラウズ:562

The Mystery Of JSON Conversion Of IntTo Float64

JSON を扱うというと単純明快に聞こえるかもしれませんが、いくつかの構造体があるので、それを JSON (一般的な統一言語) に変更して構造体に戻すことができます。シンプルですよね? ?

そうですね、そうですが、それはマーシャル/アンマーシャル関数からの奇妙な動作に遭遇するまでの話です。

問題 ?

すべては、JWT トークンからエンコードされたペイロードを読み取ろうとしたときに始まりました。以下は問題を示す例です

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    ID      int64   `json:"id"`
    PostIDs []int64 `json:"post_ids"`
}

func main() {
    u := User{
        ID:      1,
        PostIDs: []int64{1, 2, 3},
    }

    b, err := json.Marshal(u)
    if err != nil {
        panic(err)
    }

    m := make(map[string]interface{})
    if err = json.Unmarshal(b, &m); err != nil {
        panic(err)
    }

    userID, ok := m["id"].(int64)
    fmt.Printf("id: %d\nOk:%t\n", userID, ok)

    fmt.Println() // spliter

    postIDs, ok := m["id"].([]int64)
    fmt.Printf("post_ids: %v\nOk:%t\n", postIDs, ok)
}

構造体をマーシャリングおよびアンマーシャリングしてバックアウトするだけなので、同じ値が返されることが期待されます!

残念ながら、これは起こりませんでした。上記のコードは次のように出力します

// Result
id: 0
Ok:false

post_ids: []
Ok:false

その出力を見た後、私は ?問題は型変換にある可能性があるため、これらのインターフェイスにどのような型があるかを確認してみました

    fmt.Printf("id: %T\n", m["id"])
    fmt.Printf("post_ids: %T\n", m["post_ids"])
// Result
id: float64
post_ids: []interface {}

ご覧のとおり、JSON は int64 を float64 として解析しており、データの読み取り時に問題が発生します。

この問題を解決するには実際には 2 つの方法があります

?解決策 01 (困難な方法)

float64 の型アサーションを使用します。[]interface{} をすぐに []float64 にマッピングできないことに注意してください。そのため、各要素を反復して変換する必要があります

        // Parse UserID
    userID, _ := m["id"].(float64)
    fmt.Printf("id: %f\n", userID)

    fmt.Println() // spliter

    // Parse PostIDs
    postIDsArr, _ := m["post_ids"].([]interface{})
    postIDs := make([]int64, len(postIDsArr))
    for i, v := range postIDsArr {
        id, _ := v.(float64) // NOTICE: direct conversion to int64 won't work here!
        postIDs[i] = int64(id)
    }

    fmt.Printf("post_ids: %v\n", postIDs)
// Result
id: 1.000000

post_ids: [1 2 3]

?解決策 02 (簡単な方法)

解析して構造体に戻します

    b, err = json.Marshal(m) // m = map[string]interface{}
    if err != nil {
        panic(err)
    }

    var u2 User
    if err := json.Unmarshal(b, &u2); err != nil {
        panic(err)
    }

    fmt.Println(u2.ID)
    fmt.Println(u2.PostIDs)

もちろん、解決策 01 を使用する必要があるのに、解決策 02 の方が優れているのではないかと思うかもしれません。

そうですね、それは状況によります。構造体から 1 つの属性を読み取るための構造体を常に作成したいとは限りません。そのため、正しい答えは -- 状況によります!

今日の記事はこれで終わりだと思います。ゴーファーさん、何か新しいことを学んでいただければ幸いです?.

リリースステートメント この記事は次の場所に転載されています: https://dev.to/aehelaly/the-mystery-of-json-conversion-of-int64-to-float64-5eof?1 侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>
  • EchoAPI と不眠症: 実践例による包括的な比較
    EchoAPI と不眠症: 実践例による包括的な比較
    フルスタック開発者として、私は API のデバッグ、テスト、文書化のための一流のツールを用意することがいかに重要であるかを知っています。 EchoAPI と Insomnia は 2 つの傑出したオプションであり、それぞれに独自の特徴と機能があります。これらのツールについて説明し、その機能と利点を比...
    プログラミング 2024 年 11 月 2 日に公開
  • 移動時間と所要時間 |プログラミングチュートリアル
    移動時間と所要時間 |プログラミングチュートリアル
    導入 このラボは、Go の時間と期間のサポートについての理解をテストすることを目的としています。 時間 以下のコードには、Go で時間と期間を操作する方法の例が含まれています。ただし、コードの一部が欠落しています。あなたの仕事は、コードを完成させて期待通りに動作させ...
    プログラミング 2024 年 11 月 2 日に公開
  • ホイスティングにおける面接の質問と回答
    ホイスティングにおける面接の質問と回答
    1. JavaScript におけるホイスティングとは何ですか? 答え: ホイスティングは、変数や関数にメモリが割り当てられる実行コンテキストの作成フェーズ中のプロセスです。このプロセス中に、変数用のメモリが割り当てられ、変数には未定義の値が割り当てられます。関数の場合、関数定義全...
    プログラミング 2024 年 11 月 2 日に公開
  • JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    こんにちは、素晴らしい JavaScript 開発者の皆さん? ブラウザは、スクリプト (特に JavaScript) が Web ページのレイアウトと対話できるようにするドキュメント オブジェクト モデル (DOM) と呼ばれるプログラミング インターフェイスを提供します。 We...
    プログラミング 2024 年 11 月 2 日に公開
  • SPRING BATCH でプログラミングを始める
    SPRING BATCH でプログラミングを始める
    Introduction Dans vos projets personnels ou professionnels, Il vous arrive de faire des traitements sur de gros volumes de données. Le traite...
    プログラミング 2024 年 11 月 2 日に公開
  • CSS で Github プロフィールを目立たせる
    CSS で Github プロフィールを目立たせる
    これまで、Github プロフィールをカスタマイズできる唯一の方法は、写真を更新するか名前を変更することでした。これは、すべての Github プロファイルが同じに見え、カスタマイズしたり目立たせるためのオプションが最小限であることを意味しました。 それ以来、Markdown を使用してカスタム セ...
    プログラミング 2024 年 11 月 2 日に公開
  • TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript は、開発者が型を効果的に変換および再利用できるようにする組み込みのユーティリティ型を提供し、コードをより柔軟で ​​DRY にします。この記事では、TypeScript スキルを次のレベルに引き上げるのに役立つ、Partial、Pick、Omit、Record などの主要なユー...
    プログラミング 2024 年 11 月 2 日に公開
  • 電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報ボットを作成していて、ミニアプリからチャットに情報を転送するオプションを追加したいと考えています。 window.open(url, '_blank'); を使用することにしました。 iPhone で試してみるまでは問題なく動作していました。転送の代わりに、Share を取得しま...
    プログラミング 2024 年 11 月 2 日に公開
  • フロントエンド開発者とは誰ですか?
    フロントエンド開発者とは誰ですか?
    今日のインターネット上のすべての Web サイトやプラットフォームのユーザー インターフェイス部分は、フロントエンド開発者の仕事の成果です。彼らはユーザーフレンドリーなインターフェイスの作成に携わり、サイトの外観と機能を保証します。しかし、フロントエンド開発者とはいったい誰なのでしょうか?簡単に説明...
    プログラミング 2024 年 11 月 2 日に公開
  • CSS スタイルを保持したまま HTML コンテンツを PDF として保存するにはどうすればよいですか?
    CSS スタイルを保持したまま HTML コンテンツを PDF として保存するにはどうすればよいですか?
    CSS を含む HTML コンテンツを PDF として保存するWeb 開発では、コンテンツを別の形式にエクスポートする場合でも、見た目の美しさを維持することが非常に重要です。変換プロセス中に CSS スタイルが失われる可能性があるため、HTML 要素を PDF として保存しようとするときに問題が発生...
    プログラミング 2024 年 11 月 2 日に公開
  • Print_r() の使用時にファントム プロパティが DateTime オブジェクトに追加されるのはなぜですか?
    Print_r() の使用時にファントム プロパティが DateTime オブジェクトに追加されるのはなぜですか?
    Print_r() DateTime オブジェクトを変更しますPrint_r() は、DateTime オブジェクトにプロパティを追加し、デバッグ中のイントロスペクションを有効にします。この動作は、PHP 5.3 で導入された内部機能の副作用であり、テキストにダンプされたインスタンスにファントム パ...
    プログラミング 2024 年 11 月 2 日に公開
  • C のデータ構造とアルゴリズム: 初心者に優しいアプローチ
    C のデータ構造とアルゴリズム: 初心者に優しいアプローチ
    C では、データ構造とアルゴリズムを使用してデータを整理、保存、操作します。データ構造: 配列: 順序付けされたコレクション、インデックスを使用して要素にアクセスする リンク リスト: ポインターを介して要素をリンク、動的長さをサポート スタック: 先入れ後出し (FILO) 原則キュー: 先入れ先...
    プログラミング 2024 年 11 月 2 日に公開
  • ## `has_key()` または `in`?  Python で辞書キーを確認する最良の方法はどれですか?
    ## `has_key()` または `in`? Python で辞書キーを確認する最良の方法はどれですか?
    Python で辞書キーを確認するための 'has_key()' と 'in' の選択 Python 辞書内の特定のキーの場合、「has_key()」と「in」の両方が実行可能なオプションを提供します。ただし、推奨される方法は時間の経過とともに進化してきました。歴史的...
    プログラミング 2024 年 11 月 2 日に公開
  • AJAX を使用して JSON データを PHP に送信するにはどうすればよいですか?
    AJAX を使用して JSON データを PHP に送信するにはどうすればよいですか?
    Ajax を使用して JSON データを PHP に送信する方法データを JSON 形式で PHP スクリプトに送信するには、次のことが重要です。 AJAX を使用してデータを効果的に送信できるようになります。JSON データの送信提供されたコードは、AJAX を使用して JSON データを送信する...
    プログラミング 2024 年 11 月 2 日に公開
  • JS: 約束ですか、それともコールバックですか?
    JS: 約束ですか、それともコールバックですか?
    JavaScript における Promise とコールバックの理解 認定テストに関する主な質問と回答 コールバック関数とは何ですか?通常の関数との違いは何ですか? コールバック関数は引数として別の関数に渡され、非同期操作を処理するために呼び出されます。通常の関数と...
    プログラミング 2024 年 11 月 2 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3