Objective-C から JSON への変換ツール
Objective-C の dictionary、array、クラスを貼り付けてください。JSON が返ってきます。
このツールでできること
Objective-C の NSDictionary リテラルや、モデルの NSArray、あるいは @property がずらっと並んだクラス全体を持っていて、とにかく JSON 表現が欲しい — このツールがそれをやります。NSJSONSerialization を呼び出すためだけの使い捨てプログラムを書く必要はありません。
出力は、同等のインメモリオブジェクトグラフに対して [NSJSONSerialization dataWithJSONObject:options:error:] が返すものと一致します。NSDictionary は JSON オブジェクトに、NSArray は JSON 配列に、NSString は文字列のまま、NSNumber は内部の型に応じて数値または真偽値に(@YES/@NO と @42 のような違い)、NSNull / [NSNull null] は null になります。NSDate は ISO-8601 文字列で出力します — ほとんどの iOS アプリが落ち着く慣習です。
クラス全体(@interface Order : NSObject ... @end と @implementation、または [[Order alloc] init] にプロパティ代入を並べたリテラル)を貼り付けると、コンバータは各 @property を読み取り、そのキーで JSON オブジェクトを組み立てます。ネストしたクラス — Order に Address プロパティがある場合 — は入れ子の JSON オブジェクトとして展開されます。複数のクラスをまとめて貼れば、それぞれがトップレベルのエントリとして並びます。
使い方
3 ステップ。dictionary リテラル 1 つでも、クラスがぎっしり詰まったファイルでも同じ手順です。
Objective-C を貼るか、サンプルを試す
左のエディタにコードを投げ込んでください。NSDictionary リテラル、NSArray、@property 付きクラス、代入付きクラスインスタンス — どれでも OK です。
@ プレフィックス、ポインタのアスタリスク、角括弧はそのままで構いません。パーサーは @{...}、@[...]、@"..." を理解します。
変換を押す
緑の 変換 ボタンをクリックします。ツールがすべての dictionary、array、property、値を読み取り、一度のパスで JSON を組み立てます。
JSON をコピー
右パネルにインデント済みの JSON が出ます。テストフィクスチャ、API モック、ドキュメント、どこにでも貼れる状態です。コピーして次へ。
実際に助かる場面
iOS の API レスポンスフィクスチャ
ユニットテストで <code>dataWithJSONObject:</code> に渡す予定の dictionary を貼り付けて、出力を .json フィクスチャとして保存します。テストが確定的になります。
レガシー Obj-C モデルのドキュメント化
古い iOS のコードベースに、OpenAPI スペックで文書化したい Obj-C クラスがある。各モデルを JSON に変換すれば、推測なしでスキーマの形が得られます。
Swift への移植
Swift 化の一環として、各 Obj-C クラスが暗黙に持つ JSON の形が欲しい。Codable な struct を書く前のリファレンスとして、素早く生成できます。
バックエンドへの引き渡し
POST する直前の NSDictionary がある。貼って、リクエストを飛ばす前に API 契約と JSON の形が合っているかダブルチェックできます。
よくある質問
NSJSONSerialization の出力と一致しますか?
はい — それが狙いです。NSDictionary/NSArray/NSString/NSNumber/NSNull は標準の形でマッピングされます。NSDate は ISO-8601 文字列化されます(NSJSONSerialization 自体は NSDate を扱いません — ツール側で広く使われている慣習を採用しています)。
@property 宣言付きのクラスを貼れますか?
はい。各 @property が JSON オブジェクトのキーになり、型によって値の出し方が決まります(例: NSString * → 文字列、NSNumber * → 数値)。サンプルにプロパティの代入まで含まれていればそれが JSON に入り、なければプレースホルダー値が入ります。
BOOL と NSNumber はどう区別されますか?
@YES / @NO と [NSNumber numberWithBool:] は JSON の true/false を出します。整数や浮動小数点の NSNumber リテラル(@42、@3.14)は JSON 数値を出します — NSJSONSerialization がエンコードされた型から判別できるときに適用するのと同じルールです。
ネストしたクラスやオブジェクトの配列は?
ネストした NSDictionary と NSArray は完全に展開されます。別クラスをプロパティに持つクラスは入れ子の JSON オブジェクトとして出ます。モデルインスタンスの NSArray はオブジェクトの JSON 配列になり、1 インスタンス 1 要素です。
コードは保存されますか?
コードは変換のためにバックエンドへ送られ、保存はされません — ペイロードはログにも残しません。それでも、本番のキーやトークンはサンプルから消してから貼ることをお勧めします。
NSDate、NSURL、その他の Foundation 型は扱えますか?
NSDate は ISO-8601 文字列になります。NSURL は absoluteString になります。NSData は base64 になります。これらは多くの iOS チームがシリアライズ時に使う慣習で、Foundation に文書化されています。
他にも役立つツール
Objective-C から JSON は、ツールボックスの他のメンバーとも相性抜群です。