きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

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