このモジュールには、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