階層 JSON をドット記法のキーでテーブルにフラット変換
階層化された JSON オブジェクトまたは配列を、専用の走査スクリプトを作成せずに、単純なキーと値の行へ変換できます。入れ子の各プロパティにはドット記法のパスが付与され、配列の位置は数値セグメントになるため、注文 ID を常に orders.0.id のように参照できます。結果は、表計算、データベースのステージング表、ログ、マッピングツールなど、入れ子構造より予測可能なパスが必要な処理に適しています。処理は決定的で JSON の値型を保ち、不正な JSON やスカラーのルートは明確な入力エラーとして拒否します。
無料で実行
入れ子構造を予測可能なパスへ変換します
階層 JSON は関連する値をまとめられるため API に適していますが、多くのレポート作成ツールやインポートツールは平坦なフィールド列を必要とします。この機能はオブジェクトの各プロパティと配列の各要素を走査し、各セグメントをドットで連結します。customer オブジェクト内の name プロパティに保存された値は customer.name になります。orders 配列の最初の要素は orders.0 で示されるため、その識別子は orders.0.id になります。各末端値は key と value を持つ行として返され、表示、絞り込み、列への変換が容易です。走査は解析された JSON 内の順序に従うため、同じ入力から安定した結果を得られます。文字列、数値、真偽値はそれぞれの型を保ち、null も維持されます。空のオブジェクトと配列も値として出力され、暗黙に消えることはありません。そのため、元の文書に空のパスが存在した事実も平坦化した結果に残せます。
入力を準備して出力を読み取ります
完全な JSON 文書をテキストとして json フィールドに指定してください。ルートはオブジェクトまたは配列でなければなりません。この条件により、単独の文字列、数値、真偽値、null に空のキーを割り当てる曖昧さを避けられます。オブジェクトのプロパティ名は入力どおりに使用され、配列インデックスは 0 から始まる数値セグメントとして記録されます。応答には pairs が含まれ、その各要素は key と value フィールドを持つため、そのまま表の行として扱えます。ルート自体が空のオブジェクトまたは配列の場合、キーは空文字列となり、値には空のコンテナーが保持されます。元のプロパティ名に含まれるドットはエスケープされません。たとえば、user.name という単一のプロパティは、user オブジェクト内に name がある場合と同じパスになります。ドットを含む名前があり、パスから元の構造を一意に復元する必要がある場合は、平坦化前に名前を変更するか、元の JSON も保存してください。
平坦な組をデータ処理に活用します
平坦化された組は、中間表現として便利です。表計算の自動処理ではキーと値を別々の列に配置でき、取り込み処理では選択したパスを横持ちの表の列へ展開でき、比較ツールでは二つの文書を確認する前にキーで索引化できます。配列の数値セグメントによって、異なる要素の値を混同せず、繰り返しレコードを明確に区別できます。この処理はネットワーク要求を行わず、乱数、時刻、モデル推論も使わないため、同一の JSON テキストからは常に同一の出力が得られます。不正な JSON は部分結果を返さず失敗し、有効でもスカラーの JSON はオブジェクトまたは配列という条件を満たさないため失敗します。API の料金は項目ごとに $0.002 で、ブラウザーでは同じ決定的なロジックをローカル実行できます。非常に大きな文書では、末端値や空コンテナーごとに行が生じるため、ストリーミング処理やスキーマ専用処理もご検討ください。
活用例
API 応答を表向けに準備します
入れ子の応答フィールドを明示的なパスへ変換し、選択、対応付け、キーと値の行としての表示に利用できます。
インポート用の対応表を作成します
選択した JSON 値を表計算やデータベースの列へ割り当てる前に、ドット記法のパスを確認できます。
構造化レコードを比較します
二つのオブジェクトを安定したパスと値の列へ変換し、完全なパスを使って相違点を特定できます。
よくある質問
料金はいくらですか?
API は項目ごとに $0.002 です。ブラウザーでは入力をローカルで無料処理できます。
配列はどのように表されますか?
位置は 0 から始まる数値セグメントとなり、orders.0.id や orders.1.id のように表されます。
JSON の値型は維持されますか?
はい。文字列、数値、真偽値、null、空コンテナーは value フィールド内で JSON 型を維持します。
空のオブジェクトや配列はどうなりますか?
パスを失わないよう末端値として返します。空のルートコンテナーでは空のキーを使用します。
JSON の文字列や数値をルートにできますか?
できません。解析後のルートはオブジェクトまたは配列である必要があり、スカラーのルートは入力エラーになります。
元のプロパティ名にあるドットはエスケープされますか?
されません。名前はそのまま保たれるため、曖昧さなく復元する必要がある場合は事前に名前を変更してください。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/data/flatten-nested-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"json":"{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"}'const res = await fetch("https://api.kit.forhosting.com/data/flatten-nested-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/flatten-nested-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/flatten-nested-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"json":"{\\"customer\\":{\\"name\\":\\"Ada\\",\\"address\\":{\\"city\\":\\"London\\"}},\\"orders\\":[{\\"id\\":7,\\"paid\\":true}]}"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"json":"{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/flatten-nested-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.flatten_nested_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 25 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |