相互変換JSON、YAML、XML

JSON、YAMLは現在人気があり、XMLテクノロジーは過去の遺物と見なされています。









JSONおよびYAML形式のデータを処理するために「レトロテクノロジー」を使用してみましょう。 そして、今日それらを使用する理由について説明します。



タスクがあります-データ変換のロジックをアプリケーション構成に入れ、できれば宣言的なスタイルで、さまざまな形式に統一することです。 データは、json、yaml、xml、javaプロパティ、iniファイルなどのさまざまなテキストシリアル化形式にすることができます。 しかし同時に、Data Lakeはこれには重すぎる砲撃です。 ドキュメント指向またはオブジェクトリレーショナルデータベースにデータを配置し、ETL変換の最初の段階でエンジニアリングを介して、そこにアップロードされたデータに対する要求も満たそうとします。



JsonPathはXPathのサブセットを繰り返しますが、JSON形式のみです。 また、プログラミングなしで宣言クエリを作成しても機能しません。XQueryに類似するものはありません。 別の方法として、宣言型言語クエリでjvmの埋め込みデータベースを使用することもできますが、これは別のパブリケーションとjsonの元のデータモデルのトピックであり、yamlはリレーショナルではありません。



JSON / YAMLからのデータリクエストへのアプローチ



XQueryは、ドキュメントオブジェクトモデルのデータに対して実行できます。 JSON / YAMLからDOMオブジェクトにデータを変換する方法... camel-xmljsonまたはjson2xmlを使用できます。 これらのライブラリでは、データソースはjsonのみです。 したがって、彼のdom変換自転車に急いでください。 このライブラリは、Map <String、Object>を入力として取得し、それをorg.w3c.dom.Nodeに変換できます。逆変換もあります。



JSONとYAMLをMap <String、Object>に変換する方法を学ぶことは残っています。 たとえば、これはjacksonの com.fasterxml.jackson.databind.ObjectMapperクラスを使用して実行できます。



JSONをマップに変換:



ObjectMapper mapper = new ObjectMapper(); Map<String, Object> objectTree = mapper.readValue(yaml, new TypeReference<Map<String, Object>>() {});
      
      





YAMLをマップに変える:



 ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); Map<String, Object> objectTree = mapper.readValue(yaml, new TypeReference<Map<String, Object>>() {});
      
      





ライブラリをプロジェクトに接続して、マップをドキュメントオブジェクトモデルに変換します。



 DomTransformer toDom = new DomTransformer(new TypeAutoDetect()).transform(objectTree.size() == 1 ? objectTree : Collections.singletonMap("root", objectTree)); Node document = toDom.translate(objectTree);
      
      





任意のXQuery実装を使用してクエリを実行できます。 basexは、まだ開発中のオープンソースプロジェクトとして気に入っています。 org.basex:basex:jar:9.0依存関係をプロジェクトに接続し、宣言リクエストを実行します。



 String yaml = IOUtils.toString(TranslateTest.class.getResource("/pipeline.yml").toURI(), StandardCharsets.UTF_8); ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); Map<String, Object> objectGraph = mapper.readValue(yaml, new TypeReference<Map<String, Object>>() {}); Node document = new DomTransformer(new TypeAutoDetect()).transform( objectGraph.size() == 1 ? objectGraph : Collections.singletonMap("root", objectGraph)); try(QueryProcessor proc = new QueryProcessor("declare variable $extDataset external; " + " $extDataset//*[text()='git-repo']", new Context())) { proc.bind("extDataset", document); Value queryResult = proc.value(); // execute the query queryResult.iter().forEach(System.out::println); }
      
      





pipeline.ymlからのデータの作業結果







jacksonを使用してDOM / XMLをJSON / YAMLに変換する必要がある場合、 transform(Node currentNode)がこれに役立ちます。



結論



XQueryを使用すると、XMLデータだけでなくクエリを実行できます。 このクエリ言語は今でも正常に管理されており、この「老人」は、JSONおよびYAML形式であってもJavaデータ変換プロジェクトに残っています。



もちろん、不十分な構造のデータはJSON、YAML、XMLだけではありません。 そして、世界のすべての処理を終わらせるのは時期尚早です...











この出版物のアプローチが、アプリケーション内の異種データに対して宣言クエリを実行するのに役立つことを願っています。 または、JVMで同様の問題に直面していて、より良いアイデアがあり、コメントを共有してください!



4月26日、同僚と私はモスクワのオフィスで開かれたjavaミーティングを開きます。 ゲストを歓迎いたします!
仕事を終えてリラックスしたり、新しいことを学んだり、議論したり、ピザのおやつを食べたり、開発者とチャットしたりできます。



ミーティングは、2018年4月26日19時00分から21時00分に、Alsha Technologyのモスクワ事務所9、Varshavskoye Shで開催されます。



プログラムには3つのレポートがあります。



JVMプロセスでのアマゾンウェブサービスエミュレーション:開発、テストを高速化し、費用を節約します。

スピーカー: イゴール・スコルコフ



アマゾンウェブサービスインフラストラクチャでビッグデータアプリケーションを効果的に開発する方法。 ソリューションをローカルでシンプルにしようとし、統合テストはできる限り迅速かつ安価に機能します。 Amazon CEOのJeff BezosがBlue Originでロケットを打ち上げ、Boston Dynamics SpotMiniロボットと一緒に歩いている間、節約を覚えておいてください。 レポートでは、S3ファイルシステム、Redshiftデータウェアハウス、SQSキュー、PostgreSQL RDSサービスをオープンソースプロジェクトに基づくJVMプロセスでエミュレートする方法を説明します。 レポートには、BI分析用の一般的なビッグデータソリューションの比較も含まれます。



本番用のコード。

スピーカー: Yuri Geinish



堅牢で診断可能なサーバーアプリケーションを作成するための、開発者向けのシンプルだが明らかではないヒント。 このレポートは基本的な原則に焦点を当てるので、さまざまなプログラミング言語とプラットフォームの開発者に役立つ可能性があります。



Groovy向けのMeldonium:「クラウド」をさまようか、「血なまぐさい企業」に飛び込む

スピーカー: イゴール・スコルコフ



ステロイドのGroovyを使用した「クラウド」では、さらに便利になります。 Mavenアーティファクトからクラスを動的にロードする方法と、Amazon Web ServicesおよびDockerコンテナーでスクリプトを便利に実行する方法について説明しましょう。 孤立した企業環境でスクリプトを生き残る方法。 そしてもちろん、Kotlinが利用可能なときにGroovyが必要な理由のトピックをサポートします。




All Articles