JSON形式では、 null 、 boolean ( true 、 false )、 number 、 string 、 array 、 objectのタイプが定義されています 。
しかし、JSONデータをnumber 、 string 、 array 、 objectの 4つのタイプだけで表すタスクを設定するとどうなるでしょうか?
異常なプログラミングへようこそ!
プログラムゲスト: NSNJSON (Not So Normal JSON)!
内容
用語と表記
「単純な」タイプのビュー
コンテナタイプのビュー
JSONリカバリー
「単純な」タイプのJSONリカバリー
コンテナタイプのJSONリカバリ
例
ドライバー
おわりに
このタスクに少し正式にアプローチしてみましょう。 この記事では、 json.orgから取得した表記を使用します。 また、便宜上、少し追加します。
用語と表記
タイプboolean = trueを導入します | 偽
また、値が文字列型の値のサブセットである型名、オブジェクトフィールドの正しい名前である値を紹介します。
NSNJSONビューは3つのフィールドのみを使用します。
- t- タイプ -値タイプ(必須フィールド)、
- v- 値 -値(必須フィールド)、
- n- 名前 -フィールド名(オブジェクトフィールド表現で使用)。
「単純な」タイプのビュー
「単純な」タイプには、 null 、 boolean 、 string 、 numberが含まれます。
P nullの NSNJSON表現を定義します :null- > オブジェクト
value -> { "t": "null" }
NSNJSON表現の定義P true :true- > オブジェクト
value -> { "t": "boolean", "v": 1 }
NSNJSON表現の定義P false :false- > オブジェクト
value -> { "t": "boolean", "v": 0 }
PのNSNJSON表現を定義string : string → object
value -> { "t": "string", "v": value }
P 番号の NSNJSON表現を定義する: 数値 → オブジェクト
value -> { "t": "number", "v": value }
P simpleの NSNJSON表現を定義します 。 「単純な」タイプ-> オブジェクト :
P simple (value)= P null (value)、 valueがnull値の場合、
P simple (value)= P true (value)、 valueが true型の値の場合 、
P simple (value)= P false (value)、 valueがfalse値の場合、
P simple (value)= P string (value)、 valueが string型の値の場合、
P simple (value)= P number (value)valueがタイプnumberの値の場合。
コンテナタイプのビュー
以下を「コンテナ」タイプに帰属させます: array 、 object 。
配列とオブジェクトの両方に要素が含まれているため、次のことが必要です。
- まず、各要素の表現を定義し、
- 第二に、その要素の表現に基づいて、「コンテナ」全体の最終的なプレゼンテーションを決定します。
最初に、「コンテナ」、つまり「シンプル」タイプのみの値を検討します。
まず、配列、つまりarray型の値を扱いましょう。
データ配列をarray型の値とすると、次のように配列を表すことができます。
データ=(e 1 、...、e n )、
ここで、すべてのi = 1、...、n、
nは配列の長さ、
e i-配列の要素-「単純な」型の値。
プレゼンテーション関数P simpleをデータ配列の各要素に適用します。
dataElementsPresentation =(P simple (e 1 )、...、P simple (e n ))。
P 配列の NSNJSON表現を定義します : 配列 → オブジェクト
data -> { "t": "array", "v": dataElementsPresentation }
それでは、オブジェクト、つまりobject型の値を扱いましょう。
データオブジェクトをobject型の値とすると、次のようにオブジェクトを表すことができます。
data = {(name 1 、value 1 )、...、(name n 、value n )}、
ここで、すべてのi = 1、...、n、
nはオブジェクトのフィールド数です。
(名前i 、値i )-オブジェクトのフィールド、
名前i-フィールド名
値i-フィールド値-「単純」タイプの値。
JSON仕様では、オブジェクトは順序付けられていないフィールドのセットであると規定されていますが、いずれの場合も、オブジェクトのすべてのフィールドを常に反復処理し、ソート順に番号を付けることができます。 この手法を使用すると、一般性を失うことなく、 データオブジェクトをフィールドの配列として表すことができます。
valuePresentationを、プレゼンテーション関数P simpleをvalueの値に適用した結果とします 。
P フィールドの NSNJSON表現を定義します : 名前 × 値 → オブジェクト
(name, value) -> { "n": name, "t": valuePresentation.t, "v": valuePresentation.v }
P フィールド表現関数をデータオブジェクトの各フィールドに適用します。
dataFieldsPresentation =(P フィールド (名前1 、値1 )、...、P フィールド (名前n 、値n ))。
P オブジェクトの NSNJSON表現を定義する: オブジェクト → オブジェクト
data -> { "t": "object", "v": dataElementsPresentation }
P コンテナーの NSNJSON表現を定義します 。 「コンテナー」タイプ-> オブジェクト :
P コンテナ (値)= P 配列 (値)、 値が 配列型の値の場合、
P コンテナ (値)= P オブジェクト (値)(値がオブジェクト型の値の場合)
最後に、P jsonの最終的なNSNJSON表現を定義します。json- > object :
P json (値)= P simple (値)、 valueが 「単純」型の値である場合、
値が 「コンテナ」タイプの値である場合、P json (値)= P container (値)。
現在、「コンテナ」タイプのプレゼンテーションアルゴリズムで、P 単純関数の代わりにP json関数が使用されている場合、任意のJSON値を含む「コンテナ」で動作できるプレゼンテーション関数を取得します。
したがって、有効なJSONデータを表すためのスキームは、 number 、 string 、 array 、 objectの 4つのJSONタイプのみを使用して構築されました。
JSONリカバリー
JSONがあり、それからNSNSJONを取得できます。
しかし、元のJSONを復元できるようになりましたか?
できます。
値P typeの JSON型を取得するための関数を定義します: オブジェクト → 文字列
presentation -> presentation.t
typeを P type関数をプレゼンテーションに適用した結果とします。
「単純な」タイプのJSONリカバリー
回復関数を定義するR null : オブジェクト → null
presentation -> if (type == "null") { return null; }
回復関数R 番号を定義します 。 オブジェクト → 文字列
presentation -> if (type == "string") { return presentation.v; }
回復関数R 番号を定義: オブジェクト → 番号
presentation -> if (type == "number") { return presentation.v; }
回復関数を定義するR boolean : object → boolean
presentation -> if (type == "boolean") { return presentation.v != 0; }
回復関数を定義するR simple : オブジェクト → 「単純」タイプ
R simple (presentation)= R null (presentation)、 type = "null"の場合、
R simple (presentation)= R string (presentation)、 type =“ string”の場合、
type = "number"の場合、R simple (presentation)= R number (presentation)。
R simple (presentation)= R boolean (presentation)、 type = "boolean"の場合、
コンテナタイプのJSONリカバリ
前と同様に、最初に「コンテナ」、つまり「単純な」タイプのみの値を検討します。
データ配列のプレゼンテーションがあります 。
presentation.v配列の各要素に回復関数R simpleを適用します。
データ=(e 1 、...、e n )、
ここで、すべてのi = 1、...、n、
e i -R simple (presentation.v [i])-配列の要素。
回復関数R 配列を定義: オブジェクト → 配列
presentation -> if (type == "array") { return data; }
データオブジェクトのプレゼンテーションがあります。
presentation.v配列の各要素に単純な回復関数Rを適用し、フィールドnの値を使用してオブジェクトのフィールドを復元します。
データ=(e 1 、...、e n )、
ここで、すべてのi = 1、...、n、
e i- (名前i 、値i )-オブジェクトのフィールド、
name i -presentation.v [i] .n-フィールド名
値i -R simple (presentation.v [i])-フィールド値。
回復関数R オブジェクトを定義する: オブジェクト → オブジェクト
presentation -> if (type == "object") { return data; }
回復機能R コンテナを定義します 。 オブジェクト → 「コンテナ」タイプ
R コンテナ (プレゼンテーション)= R 配列 (値)、 type = "array"の場合、
type = "object"の場合、R コンテナ (プレゼンテーション)= R オブジェクト (値)。
そして最後に、回復関数R jsonを定義します: オブジェクト → json :
R json (プレゼンテーション)= R simple (プレゼンテーション)、「シンプル」タイプの値が復元された場合、
「コンテナ」タイプの値が復元される場合、R json (プレゼンテーション)= R コンテナ (プレゼンテーション)。
現在、R 単純関数ではなく「コンテナ」タイプの回復アルゴリズムでR json関数を使用すると、JSON値を含む「コンテナ」で動作できるプレゼンテーション関数が得られます。
例
結論として、NSNJSON形式の使用を示す簡単な例をいくつか示します。
例
ジョンソン | NSNJSON(それほど正常ではないJSON) |
---|---|
| |
| |
| |
| |
| |
| |
| |
| |
ドライバー
この形式で遊んでみたい人のために、2つの小さなドライバーを作成しました。
ドライバーはGitHubのプロジェクトページで入手できます: nsnjson !
ドライバー:
npmjs.comの愛好家に朗報です!
Node.jsドライバーも利用可能になりました !
また、Javaドライバーを使用してNSNJSONを試してみたい場合は、プロジェクトページで、ドライバーを手動でダウンロードしないようにMaven pom.xml ファイルを構成する方法に関する指示を見つけることができます。 :)
おわりに
今日、プログラム「Abnormal Programming」のゲストがNSNJSON(Not So Normal JSON)であったことを思い出すのは私です。
ご清聴ありがとうございました!