ついに手書きのAPIタイプをやめさせたバグは恥ずかしいほど小さかった。 paymentsエンドポイントが戻ってきた discount: null 1 つもない顧客のために、そして私はそれを入力していました discount: number なぜならインターフェイスを書いているときに見ていた1 つのレスポンスがたまたま割引の顧客だったからです TypeScriptは完全に満足していました コンパイラーはI' dを知る方法がありませんでした それに嘘をついた 3 週間後 a .toFixed(2) この分野では、私のテストや請求書にとって最も重要なユーザーのサブセットを正確に生産することができました。
これが API を手入力する場合の問題全体です。つまり、何を入力するかということです 信じろ エンドポイントが戻り、コンパイラは現実ではなく信念を忠実に強制します。typescript が下流に与えるすべての保証は、その最初の手書きインターフェイスと同じくらい優れており、ツールチェーンには実際の応答と照合するものは何もありません。安全性がまったくない静的型付けの儀式をすべて手に入れることができます。これはおそらく、型がまったくないよりも悪いです。少なくとも型のないコードは、あなたを疑わしくさせます。
実際のペイロードから型を生成すると方向が反転します 形状がどう思われるかを記述する代わりに サーバーが実際に送った応答を取り そこから形状を導きます 出力は機械的で 楽観的ではなく 存在を忘れたフィールドも 存在しなかったのです number データが言うところ number | null。 [Toolz.dev] (/ をビルドし、ブラウザベースを置きます JSON から TypeScript コンバータ これはこれを行いますが、このガイドは推論ルール自体、つまりジェネレーターが何を理解できるか、何を推測することしかできないか、そしてまだどこで考えなければならないかについてのものです。
tl;dr: JSON を TypeScript に変換するには、各キー' s 型をその値 () から推測します
string、number、boolean、null)、ネストされたオブジェクトを独自の名前付きインターフェイスに抽出し、オブジェクトの配列を単一の要素インターフェイスにマージして、一部のメンバーから欠落しているキーがオプションになるかどうかを意図的に決定しますnullという意味key?: Tやkey: T | null- その選択は、API が不在フィールドを省略するか、null として送信するかによって異なります。推論は提供するサンプルのみを反映するため、いくつかのレコードを含む代表的なペイロードを使用し、出力を完成した契約ではなくレビューされた最初のドラフトとして扱います。
なぜJSONからTypeScript型を書くのではなく生成するのか?
正直な答えは、手書きの型がドリフトし、生成された型 don't です。バックエンドがフィールドを追加すると、手書きのインターフェイスは静かに間違ったままになります。レスポンス内の余分なプロパティは、does't が言及する型には見えないため、エラーはありません。バックエンドが変更されたとき id 数字から文字列まで、インターフェイスはそれを主張し続けます ' s 数字と TypeScript は、何かが追加されるのではなく連結されるまで同意し続けます。
There's は単純な tedium 引数でもあります。典型的な REST 応答には、ネスティングの 4 つのレベルにわたる 30 個のキーがあります。これを手書きで書き起こすには、純粋な機械的作業が 10 分かかり、人間が実行する機械的作業には欠陥率があります。キー名を入力します。1 つのフィールドを見逃します。's は、文字列の配列ではなくオブジェクトの配列です。ジェネレーターはそうではありません。
しかし、最も強い理由は、世代が形を作るということです 見える。コンバータに応答を貼り付けると、すぐにあなた'd が生の JSON を読みすぎてごまかしたものが見えます metadata は実際には深く入れ子になったオブジェクトです tags ページ付けされたリストのキーの半分が一部のレコードから欠落している、空の場合もあります。生成されたインターフェイスは、data' の実際の構造の概要であり、多くの場合、それを読み取ることが、書き込んだエンドポイントを理解するための最速の方法です。 I' は、ドキュメントが嘘だった API に関するドキュメント ステップとして複数回使用しました。
これが他のデータ ツールと一致する場合: if you'ペイロードを入力するのではなく検査します JSON フォーマッタ 最初の停止はより良いです。そして、you' 2 つの応答を比較して、バージョン間で何が変更されたかを確認します json 差分 それに直接答えます.
JSONからの型推論は実際にどのように機能しますか?
JSON には 6 つの値タイプがあります RFC 8259: オブジェクト 、 配列 、 文字列 、 数 、 true/false、そして null。 TypeScript's プリミティブ タイプは、そのうちの 4 つにほぼ直接マッピングされます。興味深い作品は完全に他の 2 つです。
プリミティブは自明です. 文字列の値は意味します string.数字が意味するもの number- JSON には 1 つの数値型があるため、there' にはそのかどうかを知らせる情報がデータ内にないことに注意してください 1 は整数または浮動小数点であり、typescript は 'とにかく区別します。 true や false 暗示 boolean.この部分には曖昧さがない.
オブジェクトはインターフェイスになります. すべてのオブジェクト値が名前付きインターフェイスになり、その下に表示されたキーが名前を供給し、PascalCase に変換されます。キー owner プロデュース interface Owner.ネストが再帰する: オブジェクト内のオブジェクトは、最初のインターフェイスから参照される 2 番目のインターフェイスを生成する これは、それが聞こえるよりも重要である 代替 - ネストされたすべての形状を匿名でインライン化 - は、単一の読み取り不可能な宣言を生成し、インポート可能なものは何も与えない:
// Inlined: technically correct, practically useless
interface Project {
owner: { id: number; email: string; twoFactor: boolean }
}
// Extracted: you can import and reference Owner on its own
interface Project {
owner: Owner
}
interface Owner {
id: number
email: string
twoFactor: boolean
}
一度 Owner は名前として存在し、所有者だけを取る関数をタイプすることができます (owner: Owner) => void.inlined 版で you' d be writing Project['owner'] どこでも、うまくいきますが、読みが悪くなります。
配列は実際の意思決定が行われる場所です。 配列' s 型はその要素型の和集合です [1, 2, 3] 与えます number[] あんど [1, "a"] 与えます (number | string)[].その2 番目のものの括弧に注意してください - それらなしでは、 number | string[] は全く別のもの(数)を意味する や 文字列の配列)、およびこれを忘れたジェネレーターは、コンパイルするが間違ったものを記述するコードを発行します。
空のアレイは正直な行き止まりです。 "tags": [] 鍵が存在し配列を保持していることを伝えます; その中に何が入っているかについては何も伝えません 正しい出力は unknown[]、そしてあなたはそれをジェネレーターとして読むべきです 推測することを拒否する ではなく、完成した答えとして それを文書から自分自身に記入するか、配列が& #39; tが空であるサンプルを見つけます。
オブジェクトの配列が結合されるのではなく結合されるのはなぜですか?
これは、ジェネレーター you'd の使用と 1 つのジェネレーター you'd を 5 分後に放棄するという 1 つの決定です。
レコードが aren' t 完全に均一 - つまり、すべての実際のページ分割された応答:
{
"rows": [
{ "id": 1, "name": "Ada", "nickname": "The Countess" },
{ "id": 2, "name": "Grace" }
]
}
各要素を独立して扱い、2 つのインターフェイスの和集合が得られます: rows: (Row1 | Row2)[]。 これは 技術的には サンプルの最も正確な読み取り、そしてそれは無駄です。 へのすべてのアクセス row.nickname typescript は結合のどのメンバーを持っているかを知ることができるため、絞り込みが必要になりました。それをいくつかのオプション フィールドを含む 50 レコードの応答に拡張すると、数十のほぼ同一のインターフェイスの結合が得られます。誰もそれを望んでいません。
便利な読み方は、これら 2 つのオブジェクトが 1 つのエンティティの 2 つのインスタンスであるということです nickname はフィールドです Grace does' 持っていません:
interface Row {
id: number
name: string
nickname?: string
}
interface T {
rows: Row[]
}
That's a merge: collect every key seen across all elements, and mark a key optional if it's absent from any of them.データが実際にどのように生成されるかに一致します - 1 つのデータベーステーブル、1 つのシリアライザ、いくつかのnullable列 - そしてそれはあなたがセレモニーなしで使用できる型を生成します。 array要素名も特異化されるので、 releases 収量 Release というより Releases、 だって releases: Releases[] isn't でもバグのように読めます。
トレードオフは現実であり、明白に述べる価値があります: マージは配列が均質であることを前提としています。 真に異質な配列がある場合 - a で識別された、さまざまな形状のイベントのフィード type field - merging flattens distinct variants into one interface where nearly everything is optional. That's the wrong model, and it's a case where you should take the generated output as a starting point and hand-write a proper discriminated union. generators don't know your domain.これはオブジェクトをマージし、他のすべてのものを結合します。これはほとんどの場合正しく、すぐに見つけることができる方法で間違っています。
Null はオプションのキーになるべきですか、それとも組合員になるべきですか?
どちらの規約も擁護可能であり、違いは噛み付くため、ツールのデフォルトを受け入れるのではなく、目的を決定してください。
与え { "retiredAt": null }、以下の2 つの読みがある:
interface A { retiredAt?: string } // the field may be absent
interface B { retiredAt: string | null } // the field is present and may be null
交換可能ではありません。 で A、 retiredAt です string | undefined そして、キーはオブジェクトにまったく存在しない可能性があります。 で B、鍵は常に存在し、その値は であるかもしれない null。 アンダー strictNullChecksーどっちが TypeScript ハンドブック 推奨するものと実行する必要があるもの。どちらも欠席事件の処理を強制しますが、強制されるチェックとシリアライズも異なります。 JSON.stringify 省略 undefined プロパティは完全に放出されます null ヌルの場合、選択はワイヤーまで伝播します。
正しい答えはAPI& #39; s実際の動作に依存し、ジェネレーターは1 つのサンプルからそれを見ることができません:
| API' の動作 | 正しいモデル | なんでや |
|---|---|---|
| そこに& #39; s値がないときにキーを省略します | key?: T |
キーは本当にisn& #39; t そこ; オプションは正確です |
常にキーを送信します、 null 空っぽのとき |
key: T | null |
キーは常に存在します; ? 不在を誤って許可してしまう |
| 一貫性がない - 省略されることもあれば、ヌルになることもあります | key?: T | null |
どちらの場合も実数; 両方をモデル化します |
送信 null エラー応答のみ |
どちらも - エラーを個別にモデル化しません | Nullable フィールドは、レスポンス図形の結合を隠しています |
その最後の行は一時停止する価値のある行です。 failure cases でのみ null になるフィールドは、エンドポイントが 1 つの形状を身に着けた 2 つの異なるものを返すという信号であり、修正はステータス フィールド上の識別された和集合であり、null 許容プロパティではありません。 type generation はこのパターンを表面化します。
コンバータのデフォルトは です key?: T なぜなら、省略-when-absent は JSON API I've で動作した中でより一般的な規則であり、また、上述の配列マージ (一部のレコードに欠落しているキーと、一部のレコードで null になっているキー) でより適切に構成されるオプションをオフにして、 null 代わりにユニオンに留まります。どちらもトリックではありません。 API が実際に行うものを選択します。
aren't 有効な TypeScript 識別子であるキーについてはどうですか?
JSON オブジェクトキーは任意の文字列です。 bare 内の TypeScript プロパティ名 key: T position はそうではありません - 有効な識別子である必要があります。それで "content-type"、 "2fa"、 "user.name"、そして "" インターフェイス内で引用符で囲まれずに記述できないすべての合法的な JSON キーです。
修正は引用であり、it' sは回避策ではありません - 引用されたプロパティ名は通常のTypeScriptです:
interface Headers {
"content-type": string
"2fa": boolean
class: string
}
それらのプロパティはブラケット表記でアクセスされます ()headers["content-type"])、これはもう少し冗長ですが、完全に型安全です。 に注意してください class does'引用する必要はありません: 予約語は完全に合法です プロパティの名前、they' は識別子としては不正なのに。 という制限は、TypeScript が識別子を期待する場合にのみ適用される - そのため、同じ単語がインターフェイスになるときに処理が必要になる 名前。
このようなキーから派生したインターフェイス名は、引用よりも多くの作業が必要です。 2fa PascalCases に 2fa、どれcan& #39; tは識別子を起動するので、プレフィックスを取得します。 namedキーの下に両方とも2 つの異なるネストされたオブジェクト owner 両方ともそうなりたいでしょう Owner、なので、2 番目は となる Owner2。これらは、非魅力的な詳細です, そして、それら& #39; 正確に生成出力コンパイルまたはそれを行う前に手修理の十五分を必要とするかどうかを決定する詳細。 私はコンバータを保持するテストは簡単です: 有効なものを貼り付けます, そして出力は下にコンパイルする必要があります strict 編集なしで.
インターフェイスまたは型エイリアス?
ジェネレータはどちらかを発します。実際的な違いは狭いですが現実的であり、コードベースにはおそらくすでに lint 構成でエンコードされた意見があります。
interface User {} 宣言マージをサポート - 同じインターフェイス名を 2 回宣言し、TypeScript がそれらを組み合わせます。 't コントロールしているライブラリから型を増強するために不可欠な That's と、エラーの代わりに無音でマージする同じ名前の 2 つの無関係な宣言であるため、他の場所でもフットガン インターフェイスもサポートしています extendsこれは、制約が失敗した場合に、交差タイプよりもわずかに優れたエラー メッセージを生成します。
type User = {} can'通常は機能である t マージと it's 必須 isn't がオブジェクトの形状であるものについては、unions、tuples、mapped type、conditional type となります。 isn't が JSON オブジェクトであるルート - 数値の配列、裸の文字列 - はエイリアスとしてのみ表現できるので、 type Nums = number[] 設定に関係なく得られるものです。
生成された API タイプについては、私が傾いています interface、エラーメッセージがわずかに優れているため、およびすべての名前が1 つの生成されたファイルに住んでいる場合、マージのリスクが理論的であるためにほとんど しかし、これはコイン投げに近く、周囲のコードとの一貫性がメリットよりも重要である場合 ESLintコンフィグ @typescript-eslint/consistent-type-definitions どちらかを設定し、一致させて、それについて考えるのをやめます。
これは JSON スキーマから TypeScript とどう違うのですか?
これらは真に異なる問題と it' を解決します。なぜなら、"JSON から TypeScript" および "JSON スキーマから TypeScript" であるため、正確である価値があります。 1 つの単語が離れており、頻繁に混同されます。
JSON から TypeScript への推論は例から得られます。 入力: 値。ジェネレーターはそこで what's を観察し、一般化します。フィールドが必要かどうか、文字列が列挙型に制約されているかどうか、数値に最小値があるかどうか、または貼り付けた 1 つのサンプルが代表的であるかどうかを知ることはできません。 It's は単一の観察からの帰納法であり、それを暗示するすべてのものが含まれます。
JSON スキーマから TypeScript への変換は宣言からの変換です。 入力: a JSON スキーマ すでに型を述べているdocument、 required 配列、列挙型、形式、および制約。ジェネレータ isn't guessing - it's 既存の契約を TypeScript 構文に音訳します。 required 非オプションのプロパティにマップします; an enum 文字列リテラル和集合; に写る oneOf ユニオン型にマップします.
ルールは直接続きます: スキーマが存在する場合は、それを使用します。 JSON スキーマ、OpenAPI 仕様、a .proto ファイル、または GraphQL スキーマは、サンプリングされた応答が決して存在しない方法で権威があります。推論とは、スキーマが存在しない場合に到達するものです。文書化されていない内部エンドポイント、ドキュメントが古くなっているサードパーティの API、有機的に成長した構成ファイル形式、フィクスチャ you're writing tests against。公平を期すために言うと、これは、私たちの誰もが実際に扱う JSON の大部分を説明しています。
そこ'言及する価値のある中間パス: 推論を使用します ブートストラップ、その後手で維持します。 real responseからインターフェイスを生成して、形状とフィールド名を正しく取得してから、編集します - aを締めます string 許可された値がわかっている文字通りの結合に、 を固定します unknown[] サンプルは空のままにして、マージされたインターフェイスを適切な識別された結合に分割します。ジェネレーターは機械的な 90% を実行し、構造的に持つことができないドメイン知識を適用します。
推論はどこで間違えるのでしょうか?
短く正直なリスト。これらはすべてアプローチの制限であり、特定のツールのバグではありません。それらを知ることが、生成されたタイプをうまく使用することと、それらによって焼かれることの違いです。
単一のサンプルではタイプが過小決定されます。 's というフィールド number サンプルにはそうかもしれません null レコードの 5% で。 & #39; 貼り付けた 3 つのレコードすべてに存在するフィールドは、完全なデータセット全体でオプションである可能性があります。推論は、見たものを報告します。より多くのレコードを貼り付けます。理想的には、1 つの厳選されたオブジェクトではなく、結果の本物のページです。オプションの方が意味のあるほど正確になります。
文字列は実際のタイプを隠します. ISOタイムスタンプ、UUID、URL、メールアドレスはすべてちょうどいいです string JSON パーサー に. "2026-07-16T09:00:00Z" は意味的には日付; データには何もそうは言わない コードベースにブランドがある場合 ISODateString タイプ、あなた'手で置き換えます.
数字は精度の区別を失います. JSON& #39; s 単一の数値タイプは、 & #39; s サーバー上の 64 ビット整数は、JavaScript 数として到着し、あなたのジェネレーターがそれを見る前にすでに精度を失っている可能性がある ID を意味します - Number.MAX_SAFE_INTEGER は約 9×10¹5 であり、Twitter がこれを苦労して学んだことは有名です。 API が大きな整数を文字列として送信する場合、that's why、および the が生成されます string は 正解.
リテラル値は一般的なタイプのように見えます。 "status": "active" 推測 string、ない "active" | "archived" | "pending"。 narrower 型はもっと便利で、どのサンプルも証明できない。これは、生成された出力に対して私が行う最も一般的な手編集です。
空になったコンテナは何も言わない. [] 与えます unknown[] あんど {} 空のインターフェースを与えます。 どちらもジェネレーターが正直です。
これらはいずれも推論を安全ではなくしません - それは推論を安全にします ドラフト。機能するワークフローは次のとおりです。生成し、出力を注意深く読み取り、サンプルがコミットできた 4 つまたは 5 つのことを修正します。それと #39;s は、実際の代替手段である 30 個のキーを手書きで転写するよりも、依然として桁違いに速く、より正確です。
JSONはどこにでもアップロードされますか?
いいえ、これは質問がバッジではなく実際の答えに値するツールのカテゴリです。
JSON you'd の what's を型ジェネレータに貼り付けてください。 It's API レスポンス。つまり、ベアラー トークン、セッション識別子、顧客メール、内部ユーザー ID、価格設定層、Webhook シークレットが含まれていると考えられます。それ's は仮説ではありません - it's モーダル ケース。要点は、あなたが a をつかんだことだからです 本物 against 型への応答.
どのサーバー側コンバーターも必然的にそのペイロードを受信します。それはそれを記録しないかもしれませんし、おそらく記録します't、しかし、あなたと#39;信頼を延ばすにはあなたがする'延ばす必要はありません。データによっては、ネットワークにまったく触れないビジネスがあるタスクのコンプライアンス問題が発生する可能性があります。
型推論は解析された値に対する純粋な計算です ネットワークもアカウントもストレージも必要ありません Toolz.dev 上のコンバータは、タブで実行されている数百行の依存関係のない TypeScript です; ペイロードはブラウザの JavaScript 文字列です' s メモリとそこに留まります you' d がそのような主張を検証する方法でこれを検証できます - ネットワークタブを開いて「生成」を押すか、wifi をオフにして動作し続けるのを見てください これはサイト上のすべてのツールの背後にある同じ原理であり、I' はそれがより広く重要である理由について書いています ブラウザベースのツールが機密データに関してサーバー側のツールに勝る理由。
実用的な例
Here' sは、上記のすべてのルールを実行するために意図的に構築されているツールが付属しているサンプル:
{
"id": 4821,
"name": "Toolz",
"isPublic": true,
"retiredAt": null,
"owner": {
"id": 12,
"email": "[email protected]",
"twoFactor": false
},
"tags": ["developer", "privacy", "browser"],
"releases": [
{ "version": "1.0.0", "downloads": 1420, "notes": "First cut" },
{ "version": "1.1.0", "downloads": 3310 }
]
}
という名前のルートで Project、を生成する:
export interface Project {
id: number
name: string
isPublic: boolean
retiredAt?: null
owner: Owner
tags: string[]
releases: Release[]
}
export interface Owner {
id: number
email: string
twoFactor: boolean
}
export interface Release {
version: string
downloads: number
notes?: string
}
何が起こったのか読んでください. owner が独自のインターフェイスに抽出され、名前で参照されました。 tags に 倒れ string[] すべての要素が文字列だったからです. releases 2人のメンバーを1人に統合しました Release- 単数化 - および notes 2 番目のリリースでは ' が選択可能になったため、オプションになりました。 retiredAt 観測値が null のみだったため、オプションになりました。
そして今、あなた& #39; d修正内容を読んでください. retiredAt?: null はジェネレーター& #39; s nonest report that it has never seen a non-null value, and it& #39; s useless as a type - you& #39; d change it to retiredAt?: string なぜなら、あなたはそれを知っているからです'存在するときにはタイムスタンプです。その 1 回の編集が教訓全体です。ジェネレーターは 7 つのキー構造、ネスト、配列マージ、およびオプション性を 1 つのペーストで取得し、フィールドが何を意味するかを知る必要がある 1 つの決定を残しました。
フェイク
JSON を TypeScript インターフェイスに変換するにはどうすればよいですか?
JSONをコンバータに貼り付け、ルートタイプ名をリソースが呼び出されたものに設定し、生成を押します。 すべてのキーのタイプを推測し、ネストされたオブジェクトを独自の名前付きインターフェイスに引き出し、オブジェクトの配列を単一の要素タイプにマージし、コードを出力します。 aに直接コピーできます .ts ファイル。 There' s サインアップもアップロードもなし - 推論はブラウザで実行されます。
オブジェクトの配列はどうなりますか?
They' re merged into a one interface describing a single element, and the property is typed as an array of it.一部の配列メンバーには表示され、他のメンバーには表示されないキーは任意になります。これは、実際のページ分割データの動作と一致します。レコードは 1 つのテーブルから取得され、一部の列は nullable です。処理が悪い 1 つのケースは、さまざまなイベント タイプの真に異質な配列であり、これを識別された結合に手動で変換する必要があります。
Null はオプションのキーになるべきですか、それとも null との結合になるべきですか?
API が absent フィールドを省略するか null として送信するかによって異なります。 省略する場合は、 key?: T は正確である.もし鍵が常に存在し,時にnullであるならば, key: T | null 正確で、使用しています ? は、誤ってキーが欠落していることを許可します。コンバータはデフォルトでオプションになり、2 つのシリアライズが異なるため、切り替えることができます - JSON.stringify 未定義のプロパティを削除しますが、null のプロパティは発行します。
単一のJSONサンプルから正確な型を推測できますか?
正確な型を推測します そのサンプルには、どれisn& #39; 同じことではない. & #39; sあなたの1 つのレコードの数値は他ではnullかもしれないフィールド; あなたが貼り付けた3 つのレコードすべてに存在するフィールドは、完全なデータセット全体で任意ではなく、いくつかのレコードを持つ代表的なペイロードを使用し、完成した契約ではなくレビューされたドラフトとして出力を扱う。
何' JSON から TypeScript と JSON スキーマから TypeScript の違いは何ですか?
このツールは、値の例から型を推測します; JSON スキーマから TypeScript へ は、型、必須フィールド、列挙型を既に宣言している形式スキーマを翻訳します スキーマは権威的で推論は推測なので、JSON スキーマ、OpenAPI 仕様、または GraphQL スキーマがある場合は、スキーマが存在せず、応答ボディしか持っていない非常に一般的なケースに対する推論です。
aren't の有効な識別子であるキーをどのように処理しますか?
ダッシュ、ドット、スペース、または先頭の桁を持つキーが出力に引用されるため、 "content-type" なる "content-type": string。 That' s 有効な TypeScript、ブラケット表記でアクセス。 のような予約語 class don' プロパティ名として引用する必要はありません。このようなキーから派生したインターフェイス名は、pascalcased であり、they'd が数字で始まる場合は接頭辞が付けられ、衝突する名前には数値接尾辞が付くため、出力は常にコンパイルされます。
インターフェイスを生成するか、エイリアスを入力する必要がありますか?
コードベースがすでに行っていることすべてに一致します - これはほとんど一貫性の問題です。 interfaces support declaration merging and extends、およびわずかに明確なエラーメッセージを与える。 type aliases can't merge, これは通常望ましいもので、 isn't オブジェクト形状であるものには必須である。 there's にはインターフェイスを宣言するオブジェクトがないため、配列またはプリミティブはどちらの方法でもエイリアスとして発行されます。
私の JSON はサーバーにアップロードされていますか?
いいえ 推論エンジン全体がブラウザでJavaScriptとして動作し、ネットワーク呼び出し、ログ記録、ストレージはありません。 JSON you'dを型ジェネレータに貼り付けるのは、通常、トークン、顧客レコード、または内部IDを含む実際のAPI応答であるため、これはほとんどのツールよりも重要です。生成中にネットワーク タブを開くか、インターネットから切断します。 - それは動作し続けます。
関連ツール: JSON フォーマッタ 最初にペイロードを検査するために、 JSON から YAML へ あんど JSON から XML へ フォーマット変換、および json 差分 2 つの応答の間で何が変わったかを見つけるため。 さらに読む: JSON ツールの究極のガイド あんど 開発者のコーディング ツール ガイド。



