きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Docker × quicktype × コンテナ上でJsonからクラスファイルを生成してみた

この記事の目的

この記事では、
1.Dockerコンテナにnpm実行環境を用意すること
2.quicktypeコマンドを使って、JsonからC#のクラスファイルを出力すること

を目的としています。
※ローカル環境をできるだけ汚さないようにしようとしています。

本題

★全体的なイメージ

今回、一番やりたいことは、quicktypeでJSONをCSに変換することです。そのために、quicktypeをインストールする必要があります。quicktypeをインストールするためには、node.js(npm)が必要です。そんなわけで、nodeの環境を構築することになりましたが、ローカルにnodeをインストールして、ローカルの環境を汚したくないという気持ちがあります。SSDの容量少ないですし・・・。ということで、Dockerを使って、nodeを実行できる環境を構築し、そのうえで、quicktypeを動かしていこうと思います。※Docker自体は、AzureのUbuntu仮想マシン上に環境を用意しました。
↓イメージ図
f:id:kinakomotitti:20180830222721p:plain

★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 でもクラスの自動生成できる!)