強化されたJSONインターフェース について インターシステムズジャパン株式会社 テクニカルコンサルティング部 上級コンサルタント 皆本 稔彦 JSONについて • • • • • • • JavaScript Object Notation スマホなどのモバイルデバイスにて使用 FHIRなど医療分野でも使用されるようになる 動的なオブジェクト { バインディング不要 "name" : "John Smith", "address" : { 自由度が高い "streetAddress": "21 2nd Street", 軽量 "city" : "New York", "state" : "NY", "postalCode" : 10021 }, "phone" : [ { "home": "212 555-1234" }, { "fax": "646 555-4567" } ] } 1 インターシステムズの取り組み • %ZEN.Auxiliary.jsonProvider – JSONパーサー – COSによる実装 – 特定のクラスか%ZEN.proxyObjectのインスタンスを生成する • %ObjectToJSON,%ArrayToJSON, %WriteJSONfromSQL,%WriteJSONfromObjectメソッド – 解析可能な構造であればJSONとして出力可能 2 新JSON APIの目標 • 高速化 • 機能の向上 • 利便性の向上 3 JSON APIの高速化 • パーサーをカーネル内で行うように変更 • 文字列からオブジェクトへの変換方法を改良 • メモリ使用量を減らす 4 パフォーマンス 5 パフォーマンス 6 機能の向上 • JSON文字列を%Object,%Arrayの構造に変換 • %Object、%Arrayオブジェクト – スキーマレス – メモリでのダイナミックディスパッチ – $Listに似た配列ベースのフォーマット • 最大文字列長なし • イテレーター不要(直接該当番号に飛べるようインデックスが作成されている) • スパース配列 – メモリーフォーマットとディスク上のストレージ形式に近づける • %ZEN.proxyObject は%Objectインターフェースを使用 7 利便性の向上 • システムメソッドの追加 – $メソッド名 • Javascriptシンタックスをサポート Set array=[ 1,2,3,4 ] Set array=[ 1,x,y*2,"string",x_","_y ] Set object={ "forename":"Joe",surname:"Blogs" } 8 Javascriptシンタックスの使用方法 • 単純な配列の設定 大括弧を使用 set array = [ 1,2,3,4 ] • オブジェクトの設定 中括弧を使用 set obj = { "Name":"皆本", "Gender":"M" } • 変数値や表現式を指定 set obj = { "Name":"Tシャツ", "Amount": 3, "Total":unit*3 } • 複雑な形式も指定可能 set obj = { "customer":"鈴木", "order": [ {"name":"Tシャツ", "amount":3 }, {"name":"ズボン","amount":2 } ] } 9 代入した変数値の参照方法 • 配列の値 write array 1@%Library.Array • オブジェクトの値 write obj 2@%Library.Object • 各要素の値の参照 do obj.$toJSON() • 配列要素の取得 set val=array.$get(0) • オブジェクトのプロパティ値の参照 if obj.$isDefined("customer") { set val=obj.customer } 10 その他のアクセス方法 • JSON形式の文字列からオブジェクトを作成 set obj = ##class(%AbstractObject).$fromJSON(stream) • オブジェクトのプロパティ一覧 set it = obj.$getIterators() while it.$getNext(.key,.value) { write key,",", value,! } 11 JSONデータの格納 • ドキュメント指向データベース • JSONの構造をそのまま登録可能 • スキーマレス ドキュメント name 鈴木 address 東京都 phone 自宅 0573-11-2222 勤務先 03-2222-3333 ドキュメント name 山田 phone 自宅 078-234-5678 mail 自宅 [email protected] データベース 12 コレクション • ドキュメントを格納するためのコンテナ • ドキュメントIDで管理 • インデックスの設定が可能 患者情報コレクション ドキュメント name 鈴木 address 東京都 phone 自宅 0573-11-2222 勤務先 03-2222-3333 名前 インデックス 鈴木 ドキュメント name 山田 phone 自宅 078-234-5678 mail 自宅 [email protected] 13 山田 データベース、コレクションへのアクセス • $getDatabaseメソッドでデータベースのインスタンスを取得 set db = $SYSTEM.Document.$getDatabase() • $getCollectionメソッドでコレクションを作成、取得 set collection = db.$getCollection(コレクション名) 14 インデックスの定義 • $createIndexメソッドでインデックスを定義 set idx = collection.$createIndex(インデックス名, インデックス定義) • インデックス定義はJSON形式 { "type":"map", "key": [ ["lastname","string"],["firstname", "string"]] } 15 JSONデータの登録、更新、削除 • コレクションに対してドキュメントを追加 set doc = { "lastname":"皆本", "firstname":"稔彦", … } set ret = collection.$insert(doc) • ドキュメントの更新 set ret = collection.$replace(docid, doc) • ドキュメントの削除 set ret = collection.$remove(docid) 16 ドキュメントの検索 • SQLのJSON_TABLEマクロを使用 Select * from JSON_TABLE(…) WHERE LastName='皆本' • JSON_TABLEの記述方法 JSON_TABLE(collection,'{ "columns":[ {"column":"LastName","path":"$.lastname","type":"VARCHAR(50)"}, {"column":"FirstName","path":"$.firstname","type":"VARCHAR(50)"}, {"column":"Age","path":"$.age","type":"INTEGER"} ] }') 17 検索例 • PGAプロゴルファーのデータベース • ドキュメントの構造 { "firstname":名, "lastname":姓, "country": 国籍, "fedex":Fedexポイント, "events":参加イベント数, "wins": 優勝数, "top10":トップ10回数 } • SQL文 SELECT * from JSON_TABLE('PGAPlayers',' { "columns":[ {"column":"FirstName","path":"$.firstname","type":"VARCHAR(50)"}, {"column":"LastName","path":"$.lastname","type":"VARCHAR(50)"}, {"column":"Country","path":"$.country","type":"VARCHAR(50)"}, {"column":"FeDex","path":"$.fedex","type":"INTEGER"} ]} ') order by Fedex desc 18 リリース予定 • 2015.3 • 2016.1 19 ベータバージョンとして同梱 正式版 強化されたJSONインター フェースについて 20
© Copyright 2024 ExpyDoc