web-dev-qa-db-ja.com

JSONオブジェクトをフラット化する必要があるのはなぜですか?

StackOverflowの誰もこれまでこの質問をしなかったことに驚いています。

JSONオブジェクトのドキュメントを調べてグーグルですばやく検索しても、満足のいく結果は得られませんでした。

それの利点は何ですか?それはどのように機能しますか?


編集:明確にするために、この平坦化/非平坦化の例を見てください。

ネストされたJSONオブジェクトをフラット化/非フラット化する最速の方法

ありがとうございました。

16
wilbeibi

一部のライブラリによって自動的に作成されたJSONテキストを取得する状況は数多くあります。プログラミング言語全体に、JSONテキストを構築する多くのライブラリがあります(1つ 例はここにあります )。

ライブラリがオブジェクトまたは配列のラッピングを追加するときはいつでも、JSONをサーバーに送信し、オブジェクト(または配列)ではなくプリミティブ値を期待するためにコードがクラッシュするため、それらを削除することをお勧めします。または、JSONがサーバー応答である場合、結果のJavascriptコードがオブジェクト/配列間で異なる必要があるか、オブジェクト/配列間で異なる必要がないようにする必要があります。これらすべての場合において、平坦化は時間を節約するので役立ちます。より少ないif/elsesを実装する必要があり、データ構造が可能な限りフラットであることが確実に期待できます。

上記のシナリオのコードを改善するためのもう1つのアプローチは、コードを最大限に堅牢な方法で記述して、余分なラッピングによってコードがクラッシュすることがないようにすることです。したがって、常にいくつかのラッパーを期待し、その内容を取得します。その場合、平坦化は必要ありません。

ご覧のとおり、JSONを構築しているものと解析しているものによって異なります。建物はあなたの範囲外である可能性があります。

これは、データモデルの質問にもつながります。あるXYのエントリが0ある場合、またはあるXYのエントリが0を超える場合は、別の方法で静かに解析する必要があるXMLコードを使用しました。一部のXYのエントリを0個以上持つことができるラッパーがあると、ライブが簡単になります。これらはデータモデルの乾燥です。

JSONが手動で結合したオブジェクト構造を表す場合はすべて、変更されないことを期待しています。ですから、私が詳細に設計したものを平らにするのは気がかりです。私が見た限りでは、標準的な操作は平坦化する必要はありません(例:JSON.stringify()json_encode()など)

6
peter_the_oak

簡単なシナリオは次のとおりです。Webアプリには、複雑なリレーショナルオブジェクトを更新するHTTP POSTがあります。

POST
update=1
&user.id=12345
&[email protected]
&user.profile.name=Mr. Test
&user.profile.age=42
&[email protected]
&[email protected]
&[email protected]
&user.profile.skill.0.id=100
&user.profile.skill.0.name=javascript
&user.profile.skill.1.id=200
&user.profile.skill.1.name=piano

すべてがすでにフラットな構造になっているので、単純な1対1のバインディングを使用してみませんか?強制する必要のある制約またはセキュリティ要件のリストがある場合は、ソートされたキーリストを直接検索してそれらを検証できます。

フラットな構造は、データベースの非正規化とのクロスオーバーもあり、人々が理解して作業するのが簡単です。また、コンテキスト固有のセキュリティと制約を読みやすく、しかしより冗長な方法で実装することもできます。

ユーザーのビュー全体を表示する場合、ユーザーのスキルリストの主キーIDの表示を非表示にすることができます。

"user.profile.skill.#.id": { hidden: true, readonly: true }

ただし、スキルを直接見る場合(管理者として編集する場合)は、IDを確認することをお勧めします。

"skill.id": { readonly: true }

ユーザー中心/セルフサービスタイプのCMSアプリケーションを作成している場合は、ネストされたモデルだけを使用する場合よりも多くのユーザーが参加し、単純なフラットモデル(基になるネストされたリレーショナルモデルのフラットな抽象化)を使用して貢献できます。 。

TLDR:フラットはネストされたものよりも読みやすいです。プログラマーはネストされたスキーマ、再帰的な解析および処理を処理できますが、エンドユーザーと管理者は通常、その部分を抽象化することを好みます。

5
Louis Ricci