このモジュールには、JSONデータを処理するための関数が含まれています。これを使用して、他のファイル形式で埋め込まれているJSONを処理できます。たとえば、大規模なテキスト・ファイルに行として格納されているJSONを問い合せるには、json:parse-as-xml
およびtext:collection
関数を使用します。
現在、大規模なJSONファイルの並列処理はサポートされていません。
問合せで組込み関数を使用するには、次のようにJSONモジュールをインポートする必要があります。
import module "oxh:json";
JSONモジュールには、次の関数が含まれています。
JSON値をXMLとして解析します。
注意
JSONオブジェクトからXMLへの変換について
JSONオブジェクトはAvroマップに似ており、同じXML構造に変換されます。「マップの読取り」を参照してください。
たとえば、次のJSONオブジェクトがXML要素に変換されます。
{ "user" : "john", "full_name" : "John Doe", "age" : 45 }
オブジェクトは次の要素としてモデル化されます。
<oxh:item> <oxh:entry key="user">john</oxh:entry> <oxh:entry key="full_name">John Doe</oxh:entry> <oxh:entry key="age">45</oxh:entry> </oxh:item>
JSON配列からXMLへの変換について
JSON配列はAvro配列に似ており、同じXML構造に変換されます。「配列の読取り」を参照してください。
たとえば、次のJSON配列がXML要素に変換されます。
[ "red", "blue", "green" ]
配列は次の要素としてモデル化されます。
<oxh:item> <oxh:item>red</oxh:item> <oxh:item>blue</oxh:item> <oxh:item>green</oxh:item> </oxh:item>
他のJSONタイプの変換について
他のJSON値は次のようにマップされます。
XMLとしてモデル化されたJSONオブジェクトからエントリを取得します。
シグネチャ
json:get($key as xs:string?, $obj as node()?) as element(oxh:entry)?
または
json:get($key as xs:string?) as element(oxh:entry)?
戻り値
次のXPath式の値。
$obj/oxh:entry[@key eq $key]
$input
が存在しない場合、動作は、2つの引数の関数を呼び出して$obj
のコンテキスト項目を使用するのと同じです。「注意」を参照してください。
注意
次は同等です。
$var/json:get("key") json:get("key", $var) $var/oxh:entry[@key eq "key"]
$var
は、XMLとしてモデル化されたJSONオブジェクトです。「マップの読取り」を参照してください。
次の例は、HDFS内の次のテキスト・ファイルを問い合せます。
mydata/users-json.txt { "user" : "john", "full name" : "John Doe", "age" : 45 } { "user" : "kelly", "full name" : "Kelly Johnson", "age" : 32 } { "user" : "laura", "full name" : "Laura Smith", "age" : null } { "user" : "phil", "full name" : "Phil Johnson", "age" : 27 }
次の問合せは、30歳を超えるユーザーの名前を選択します。
import module "oxh:text"; import module "oxh:json"; for $line in text:collection("mydata/users-json.txt") let $user := json:parse-as-xml($line) where $user/json:get("age") gt 30 return text:put-text($user/json:get("full name"))
この問合せは、次の行を含むテキスト・ファイルを生成します。
John Doe Kelly Johnson
次の問合せは、age値がnullの従業員の名前を選択します。
import module "oxh:text"; import module "oxh:json"; for $line in text:collection("mydata/users-json.txt") let $user := json:parse-as-xml($line) where $user/json:get("age")/nilled() return text:put-text($user/json:get("full name"))
この問合せは、次の行を含むテキスト・ファイルを生成します。
Laura Smith