拡張表現 -1



値を求める方法の表現

 ここからは、ツールのための独自の表現です。従って、ここにある記述があると、JSON Schemaとしては不正であるとして各種ソフトウェアが正常動作しない可能性があります。また、仕様については事前の予告なく、改訂する事もあり得ます。

■csvからデータを取り出す指定
 csvからデータを取り出す事を示す指定です。この指定はctojツールで指定可能です。記述方法は以下の通りです。括弧は省略可能を示しています。Jsonの規定に従った記述ですので、例えば括弧を省略する時はカンマも削除するなど、そこは合わせて下さい。

   "type": 値の型指定,
   "dataSource": {
       "csvAttr": "csv内の項目名",
      ("prefix": "プレフィックス指定"),
      ("format": "形式の指定"),
      ("pattern": "文字列のパターンの指定"),
      ("alternate": "代替えの指定"),
      ("const": "既定値指定")
   }

   "type": 値の型指定,
   "dataSource": {
       "dataSource": ・・ リカーシブルに記述できます,
       "entityType": 検索するEntities,
       "searchAttr": 検索する際にキーとするAttribute名,
       "valueAttr": 値を取り出すAttribute名,
      ("identificationType": "identificationTypeの値",
      ("prefix": "プレフィックス指定"),
      ("format": "形式の指定"),
      ("pattern": "文字列のパターンの指定"),
      ("alternate": "代替えの指定")
      ("const": "既定値指定")
   }

この「値のの型指定」は基本表現のtype指定です。型としては"integer","number",string","boolean"です。つまり、dataSourceはitemsに中やpropertiesの中のattributeの中に記述する事になります。
 これらの指定方法の内、一つ目はcsvAttrで指定したcsvの項目の値を作成するJsonの値に転記する指定です。二つ目は、内側のdataSourceで得た値でentitytypeで指定したデータで検索して検索結果の値をJsonの値とする指定です。詳しくは、後述します。
 dataSourceは以下の様にリスト形式で記述する事も可能です。

   "dataSource": [
       {
           "csvAttr": "csv内の項目名",
          ("prefix": "プレフィックス指定"),
          ("format": "形式の指定"),
          ("pattern": "文字列のパターンの指定"),
          ("alternate": "代替えの指定")
          ("const": "既定値指定")
       },
       {
           "csvAttr": "csv内の項目名",
          ("prefix": "プレフィックス指定"),
          ("format": "形式の指定"),
          ("pattern": "文字列のパターンの指定"),
          ("alternate": "代替えの指定")
          ("const": "既定値指定")
       },・・繰返し
   ]

   "dataSource": [
       {
           "dataSource": ・・ リカーシブルに記述できます,
           "entityType": 検索するEntities,
           "searchAttr": 検索する際にキーとするAttribute名,
           "valueAttr": 値を取り出すAttribute名,
          ("identificationType": "identificationTypeの値",
          ("prefix": "プレフィックス指定"),
          ("format": "形式の指定"),
          ("pattern": "文字列のパターンの指定"),
          ("alternate": "代替えの指定")
          ("const": "既定値指定")
       },
       {
           "dataSource": ・・ リカーシブルに記述できます,
           "entityType": 検索するEntities,
           "searchAttr": 検索する際にキーとするAttribute名,
           "valueAttr": 値を取り出すAttribute名,
          ("identificationType": "identificationTypeの値",
          ("prefix": "プレフィックス指定"),
          ("format": "形式の指定"),
          ("pattern": "文字列のパターンの指定"),
          ("alternate": "代替えの指定")
          ("const": "既定値指定")
       },・・繰返し
   }

この様に記述すると、csvの複数の項目を文字列として結合してJsonの値を作る事ができます。例えば、idの文字列を法人番号と部門番号をハイフンで繋げて作成する際などに使用します。詳しくは、後述します。
 「リカーシブルに記述できます」とは、例えは以下の様な記述です。

   "dataSource": {
       "dataSource": {
           "dataSource": "dataSource": {
               "csvAttr": "csv内の項目名",
              ("prefix": "プレフィックスの値"),
              ("format": "形式の指定"),
              ("pattern": "文字列のパターンの指定"),
              ("alternate": "代替えの指定")
              ("const": "既定値指定")
           }
           "entityType": 検索するEntities,
           "searchAttr": 検索する際にキーとするAttribute名,
           "valueAttr": 値を取り出すAttribute名,
          ("identificationType": "identificationTypeの値",
          ("prefix": "プレフィックス"の文字列),
          ("format": "形式の指定"),
          ("pattern": "文字列のパターンの指定"),
          ("alternate": "代替えの指定")
          ("const": "既定値指定")
       }
       "entityType": 検索するEntities,
       "searchAttr": 検索する際にキーとするAttribute名,
       "valueAttr": 値を取り出すAttribute名,
      ("identificationType": "identificationTypeの値",
      ("prefix": "プレフィックス"の文字列),
      ("format": "形式の指定"),
      ("pattern": "文字列のパターンの指定"),
      ("alternate": "代替えの指定")
      ("const": "既定値指定")
   }

この様に記述すると、内側のdataSourceから順番に処理します。つまり、一番内側のdataSourceはcsvAttrの指定があるので、csvの項目から値を取り出します。その値を二番目のdataSourceの指定に従って既存のEntityを検索して値を変換し、その変換した値を一番外側の検索の指定に従って再度検索して得た値をJsonの値とします。

■csv内の項目名
 csvAttrでは、cavの項目名を指定します。csvの項目名とは、csvの一行目に記述した項目の名称の事です。記述方法は、

   "csvAttr":"csv内の項目名"

であり、記述箇所はdataSourceの中です。但し、entityTypeと同時に記述する事はできません。

■プレフィックス指定
 csvなどから求めた値に対し、プレフィックスを付けてJSONに変換したい場合に記述します。記述箇所は前記の二つの指定と共に記述します。例えば、以下となります。

   "dataSource": {
       "csvAttr": "項目A",
       "prefix": "abd-
   }

この様に記述してcsvから求めた項目Aの値が"100"だったとすると、生成される文字列は"abd-100"となります。

■既存Entityの検索指定
 既に生成したNGSI V2のJSONデータから値を求める場合の指定です。再掲すると以下の形式です。

   "dataSource": {
       "dataSource": ・・ リカーシブルに記述できます,
       "entityType": 検索するEntities,
       "searchAttr": 検索する際にキーとするAttribute名,
       "valueAttr": 値を取り出すAttribute名,
      ("identificationType": "identificationTypeの値",
      ("prefix": "プレフィックス指定"),
      ("format": "形式の指定"),
      ("pattern": "文字列のパターンの指定"),
      ("alternate": "代替えの指定")
      ("const": "既定値指定")
   }

 dataSourceは、検索の入力となる値の指定です。entityTypeは検索対象となるentityTypeです。dataSourceで入力された値とsearchAttrの値が一致するEntityを検索します。Entityが見つかったら、valueAttrに登録されている値を出力します。
 identificationGroupを検索する際にキーとするAttribute名や値を取り出すAttribute名に指定する場合は、Attribute名を"identificationGroup.identification"と指定すると共に、"identificationType"でどのifrntificationなのかを指定します。

■代替えの指定
 前記の方法で値が求められなかった場合に代替えの指定に記述した項目から値を求めます。記述内容はdataSourceと同じものを記載可能です。例えば、以下となります。

   "dataSource": {
       "csvAttr": "項目名1"
       "alternate": {
           "csvAttr": "項目名2"
       }
   }

この例では、項目名1をまず確認し、項目名1の値が無ければ項目名2の値をJsonの項目の値わ転記します。

■既定値指定
 以上記述したいずれの方法でも値を求められなかったときにJSON内に登録する値です。指定方法は
   "const": 既定値
constは、JSON Schemaではその値でなければならないという制約の記述ですが、ツールでは、前記の各種指定を優先するので、constの指定は既定値として動作します。
 "const"の指定は基本表現にも存在します。そこでdataSourceと並列にconstが記述されていた場合は、dataSourceにも反映され、値が求められ中った場合に採用されます。
 尚、後述する「"format": "PostalAddress"」や「順序無しリストの絞り込み」では違う意味も持ちます。



順序付きリスト表現

Arrayには複数の値を登録できますが、Arrayの内登録位置や登録順序に意味がある場合は順序付きリスト(ordered list)と呼びます。共通データ仕様では、BuildingやFacilityのZonesの中のsubzoneNameがこれに該当します。一方、JSON Schemaには、順序付きリストに関する表現方法はありません。そこで、JSON Schemaに対し、独自に拡張しています。

■JSON Schemaオリジナルの表現
 共通データ仕様では、subzoneNameは第一項が文字列で、第二項がArrayです。しかし、標準のJSON Schemaでは以下の様に第一項と第二項の区別なく、文字列でもarrayでも構わないと言う表現になます。


"subzoneName":{
   "type": "array",
   "items": {
       "type": ["string","array"],
       "items": {"type": "string"}
   },
   "maxItems":2
}

■拡張表現
 順序付きリストである事を"ordered"で宣言するとともに、以下の様にitemsを複数記述できる様にします。記述した順番にArrayに登録します。


"subzoneName":{
   "type": "array",
   "items": [
       {"type": "string"},
       {
           "type": "array",
           "items": {"type": "string"}
       }
   ]
   "maxItems":2,
   "ordered": true
}



順序無しリストの絞り込み

■identificationType
 objectがArrayの中に並んでいる場合で前記の順序付きではない場合、どのobjectから値を取り出すかの指定が必要です。共通データ仕様では、identificationGroupが該当します。例えば以下の様なAttributeとなります。


"identificationGroup": {
   "type": "IdentificationGroup",
   "value": [
       {
           "identification": "342025",
           "identificationType": "自治体コード"
       },
       {
           "identification": "9000020342025",
           "identificationType": "法人番号"
       }
   ]
}

そこで、identificationGroupに限って、どのオブジェクトかを指定するために"identificationType"を定義しています。例えば、以下の様に指定します。


   "abc": {
     "type": "string",
     "dataSource": {
         "dataSource": {"csvAttr": "メーカ名"},
         "entityType": "Organization",
         "searchAttr": "name",
         "valueAttr": "identificationGroup.identification",
         "identificationType": "法人番号"
   },

 この様に記述する事で、メーカ名をキーにOrganizationを検索して、identificationGroupからidentificationTypeが"法人番号"であるidentificationの値を取り出します。




csvの複数行の名寄せ

 csvではひとつのカラムに複数の値を持つデータの表現が難しく、時としてcsvファイルを分けるケースがあります。例えば建物の部屋の情報をcsvファイルに格納したい場合、建物一覧と部屋一覧を別のcsvファイルに分けて登録する手法が使われます。一方、Jsonファイルはひとつのファイルに両方入れる事に支障はありません。Jsonファイルで情報を建物単位に作成した場合、Jsonファイル内の各情報は、部屋一覧の複数の行に対応する事になります。そこで、csvファイルのカラムを名寄せしてひとつのJsonにまとめる拡張Json Schemaの表現を提供します。

■名寄せの要否指定
 Attribute毎に名寄せが必要な項目なのかどうかを指定します。Attributeのレベルに"merge": "union"で指定します。以下の形式です。


   "abc": {
     "type": "string",
     "dataSource": ・・・,
     "merge": "union"
   },

■名寄せのキーとなる値の指定
 名寄せの値がSub-attributeの場合は、"mergekey": "<Sub-attribute名>"で指定します。指定箇所は、名寄せしたいarrayの記述の中です。以下の形式です。


   "abc": {
     "type": "array",
     "items": {
         "type": "object",
         "properties": {
             "def": {
                 "type": "string"
                 ・・・,
             "ghi": ・・・
     "mergekey": "def"
   }

 指定するsub-attributeがarrayの場合は、arayの中の位置も指定します。形式は以下です。


   "abc": {
     "type": "array",
     "items": {
         "type": "object",
         "properties": {
             "def": {
                 "type": "array"
                 ・・・,
             "ghi": ・・・
     "mergekey": ["def", 0]
   }