この記事の目的
この記事では、
1.Dockerコンテナにnpm実行環境を用意すること
2.quicktypeコマンドを使って、JsonからC#のクラスファイルを出力すること
を目的としています。
※ローカル環境をできるだけ汚さないようにしようとしています。
本題
★全体的なイメージ
今回、一番やりたいことは、quicktypeでJSONをCSに変換することです。そのために、quicktypeをインストールする必要があります。quicktypeをインストールするためには、node.js(npm)が必要です。そんなわけで、nodeの環境を構築することになりましたが、ローカルにnodeをインストールして、ローカルの環境を汚したくないという気持ちがあります。SSDの容量少ないですし・・・。ということで、Dockerを使って、nodeを実行できる環境を構築し、そのうえで、quicktypeを動かしていこうと思います。※Docker自体は、AzureのUbuntu仮想マシン上に環境を用意しました。
↓イメージ図
★npmイメージの取得
npmを使えるようにするためには、npmをインストールする必要があります。今回は「ローカル環境を汚さない」ことを前提としているので、ローカル環境にnpm(node.js)はインストールしません。ローカルにnpm(node.js)をインストールしない代わりにDockerの【node】イメージを使います。
https://hub.docker.com/_/node/
以下のコマンドを実行し、nodeイメージをpull(取得)します。
docker pull node
このnodeイメージ
★npmコンテナの起動
以下のコマンドを実行し、nodeイメージを起動します。
docker run -v /home/dotnet/docker/node:/etc/var -p 8080:3000 -it node /bin/bash
これで、nodeイメージのDockerコンテナの起動に成功しました。また、オプションの指定により、起動したコンテナに接続した状態にもなっています。
メモ;起動した後のDockerコンテナにアクセスするには、docker exec コマンドを利用します。詳しくはWebで!
qiita.com
★quicktpyeのインストール
quicktypeのreadmeに従いインストールを行います。
上記のコマンドを利用してDockerを起動すると、nodeがインストールされた環境にログインした状態になります。nodeがインストールされた環境なので、npmコマンドを利用することができます。以下のコマンドを実行し、目的の【quicktype】をインストールします。
npm install -g quicktype
インストールが終わると、quicktypeコマンドが利用できるようになります。
参考)
github.com
★変換実行
早速、Json→CSに変換していきます。まずは、変換対象となるJsonファイルを作成します。
・・・が、ここまでの操作だけでは、あの「vi」が使えません。まずは、vimのインストールが必要となります。
apt-get update apt-get install vim
上記コマンドをインストールし、viを利用できるようにします。viが準備できたら、Sample.jsonという名前で簡易的なJsonファイルを作成します。
{ "param1": "value1", "param2": "value2" }
ここで、quicktypeコマンドを実行し、output.csファイを出力します。
quicktype Sample.json -o output.cs
出力結果↓
// Please help improve quicktype by enabling anonymous telemetry with: // // $ quicktype --telemetry enable // // You can also enable telemetry on any quicktype invocation: // // $ quicktype pokedex.json -o Pokedex.cs --telemetry enable // // This helps us improve quicktype by measuring: // // * How many people use quicktype // * Which features are popular or unpopular // * Performance // * Errors // // quicktype does not collect: // // * Your filenames or input data // * Any personally identifiable information (PII) // * Anything not directly related to quicktype's usage // // If you don't want to help improve quicktype, you can dismiss this message with: // // $ quicktype --telemetry disable // // For a full privacy policy, visit app.quicktype.io/privacy // namespace QuickType { using System; using System.Collections.Generic; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; public partial class Output { [JsonProperty("param1")] public string Param1 { get; set; } [JsonProperty("param2")] public string Param2 { get; set; } } public partial class Output { public static Output FromJson(string json) => JsonConvert.DeserializeObject<Output>(json, QuickType.Converter.Settings); } public static class Serialize { public static string ToJson(this Output self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings); } internal static class Converter { public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, DateParseHandling = DateParseHandling.None, Converters = { new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } }, }; } }
できました!Newton.jsonがUsingされているクラスが出力されました。Json⇔クラスのやり取りで必ず実装するConverter処理まで実装されています。かなりリッチな出力です。
★Visual Studioでもできるよ!
Visual Studioの機能でも、Json形式のテキストから、クラスを自動生成してくれる機能があります。quicktypeと同じJsonテキストを使ってクラスを自動生成した結果は以下の通りです。
public class Rootobject { public string param1 { get; set; } public string param2 { get; set; } }
シンプルで見やすいです。どちらが良いかは、使うときによって決まると思います。Visual Studioでの自動生成機能もあることも抑えておいたほうが良いですね(*'▽')
www.kinakomotitti.net
まとめ
Dockerのnodeイメージを使って、ローカル環境を汚さずにnpm、quicktypeコマンドを実行できる環境を用意することができる。
quicktypeを使うと、Jsonファイルから、クラスを自動生成できる。
自動生成されるクラスは、Converter や、属性が付いたリッチなものとなっている。
(Visual Studio でもクラスの自動生成できる!)