IBM Code サイトに JSONata の良い説明ページがあったので訳してみた

JSONata 関連の情報を検索していたら、米国 IBM の IBM Code というサイトに短いけどよくまとまった [紹介ページ](https://developer.ibm.com/code/open/projects/jsonata/) を発見。とりあえず訳してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b1794e98-3b8e-0b33-de62-311226db3ebd.png)

# 概要

JSONata は、JSON データ構造を照会および変換するための式言語です。JSON(JavaScript Object Notation)は、インターネット上のシステム間でデータを交換するための事実上の標準フォーマットになりつつあります。Twitter、Facebook、GitHub など多くのサイトが JSON ペイロードを交換する REST API を提供しています。JSON の主な強みは、軽量の構文とシンプルなデータモデルであり、RESTful なWeb サービスの主要なペイロード形式として普及しています。

[Get the code](https://github.com/jsonata-js/jsonata)

# 説明

軽量なデータ形式では、軽量のクエリと変換技術が必要です。シンプルなクエリが簡単に記述できるよう設計された JSONata は、非常に浅い学習曲線を持っています。より複雑な表現は、すでにマスターされている概念に自然と基づいており、言語設計として驚くほど最先端です。完全に構成可能な演算子と関数のセットは、式内に新しい関数を定義する機能を含んでおり、データ変換タスクの複雑さに制限はありません。

JSONata は、XPath からインスピレーションを受けたロケーションパスのセマンティクス、XQuery からインスパイアされた JSON 構造に出力をフォーマットする機能、Scheme からインスピレーションを受けた関数型プログラミングモデルによって支えられています。

XPath からインスピレーションを受けたロケーションパス:

* 構造内の値を選択するためのシンプルで直感的な構文
* 複雑なクエリとデータ結合のための強力な述語メカニズム
* データを操作および集計するための組み込み関数および演算子

XQuery からインスパイアされた JSON 構造に出力をフォーマットする機能:

* 新しいオブジェクトと配列の構築に使用される標準 JSON 構文
* 有効な JSON データは有効な JSONata 式でもあること
* テンプレートスタイルのクエリを構築できる

Scheme からインスピレーションを受けた関数型プログラミングモデル:

* [SICP](https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E6%A9%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A7%A3%E9%87%88) に記述されている「メタ循環 評価器(metacircular evaluator)」を実装
* ユーザー定義関数(クロージャ)をサポート
* チューリング完全である

ランタイムプロセッサの軽量化により、Web ブラウザやパッケージ依存関係のない [Node.js モジュール](https://www.npmjs.com/package/jsonata) として動作させることができます。

## プロジェクトへの貢献

多数の JSON パス構文があります、他に必要ですか？ XPath の最新バージョンが単なる XML ナビゲーション構文以上のものであると同じ意味で、JSONata は単なる JSON ナビゲーション構文以上のものです。この言語は、洗練された機能的な計算エンジンで簡単にクエリ構文を拡張します。JSONata を使用すれば、複雑な変換の問題でコードを放棄して、別の言語に切り替える必要はなくなるでしょう。

JSONata プロジェクトに貢献する方法は幾つもありますが、特に組み込み関数ライブラリの開発で貢献できます。また、C、Ruby、Python、.NET、Swift など他の言語環境で JSONata ランタイムを実装するには、多くの作業が必要です。

## どのような技術的問題を解決するのに役立つでしょうか？

可能性を秘めた巨大な JSON 構造に埋もれている、意味のあるデータを抜き出すことがこのツールの本質です。JSONata は JSON データのクエリと変換を含むあらゆる問題に適用できます。データ抽出タスクがどれほど複雑であっても、JSONata 言語で表現し実行できます。

## JSONata はどのように私のビジネスに役立ちますか？

IT 部門から得た JSON データをクエリして、それを営業の専門家の手に渡します。複雑なクエリを、プログラミング言語の専門知識なしに記述することができます。

これらクエリのコンパクトな性質は、Web アプリケーションやモバイルアプリケーションで JSONata 式をシングルライン・プロパティとして作成できることを意味します。軽量でブラウザに優しい実装により、ユーザーはソフトウェアをインストールしたり外部クラウドサービスを呼び出すことなく、迅速に情報を探索し抽出することができます。

# JSONata 1.2 の新機能

元ページからリンクされていた [JSONata 1.2 adds more power to your queries](https://developer.ibm.com/code/2017/05/23/jsonata-1-2-adds-power-queries/) というブログ記事も一緒に訳しておきます。2017年6月5日更新の古い記事ですが、知らない機能だったので。こないだ訳したマニュアル古いのかなw

## 概要

JSONata のクエリと変換言語のバージョン1.2を発表して誇りに思っています。JSONata は JSON データを抽出し操作するためのオープンソースの宣言型言語です これには、述部ベースの照会、グループ化、集約、結果構造のフォーマットのためのファーストクラスの構文が含まれています。

バージョン1.2では、組み込み関数をいくつか追加して、クエリ結果を並べ替えるための構文を追加しました。また、非同期関数をプラグインするためのサポートが追加され、Node.js エコシステムでより良い振る舞いができるようになりました。

## 新しい ‘order-by’ 構文

この新しい構文を使用すると、クエリの結果を並べ替える方法を指定できます。これがなければ、クエリの結果はドキュメントの順序で、または入力 JSON に表示される順序で返されます。

この新しい構文を使用すると、1つまたは複数のソート条件に従って結果を並べ替えることができます。これらの用語は、単純なプロパティ参照から複雑な式に至るまでのあらゆるものです。たとえば、価格の低い順に並べたり、年齢の高い順に並べたり、データから抽出できる他の指標を使用して、クエリで並び順を設定することができます。

例えば、`Account.Order.Product^(>Price, <Quantity)` は、`Product` を出力しますが、並び順は `Price` で降順、かつ `Quantity` で昇順の並びになります。

## 新しい関数

この最新リリースには多くの新機能が追加されました。前回の JSONata のリリースには、文字列データを処理する優れた機能が含まれていました。

このリリースでは、他の JSON データ型を追加しました。このリリースでは、数値、配列、オブジェクトを処理するための新しい関数が多数用意されており、組み込み関数の総数は 45 になりました。もちろん、JSONata や JavaScript で関数ライブラリをいつでも拡張することができます。

## 非同期関数のサポート

最初から、JavaScript 開発者は、常に組み込み関数ライブラリを独自の関数で拡張することができました。しかし関数の開発者は、機能がブロックされないようにする必要がありました。つまり、JSONata に制御を戻す前に、何か他のことが起こるのを待つことが難しかったのです。

これは、拡張機能が外部システムへの HTTP 要求をしたいかもしれない現代のマイクロサービスの世界ではうまくいきません。バージョン1.2では、Promise を返す拡張関数を書くことができ、JSONata エンジンが制御を行い、外部システムが結果を返すと処理を開始することができます。

# おわりに

いやあ、短いですが小気味よく JSONata について説明されたページでした。JSONata 関連では他にも情報を翻訳していますので、興味があったら読んでみてください。

* [Node-RED の change/switch ノードで使える JSONata の README.md を訳してみた](https://qiita.com/yamachan360/items/2bb60abcf0f15b2c22fc)
* [JSONata の言語ガイドを訳してみた](https://qiita.com/yamachan360/items/91805334890d18ef6e23)

ではでは！