しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Visual Studio 2012 の「JSON / XML をクラスとして貼り付ける」機能が便利すぎるけど

最近 Twitter で酢酸先生が同じような内容で悩んでいました。

その度に Visual Studio 2012 で出来るよ!と呟いてるんですが、もしかして出ない環境がある?

少なくとも、現時点で最新の Visual Studio 2012 Update 3 をインストール済みの環境では使えるようになっているはずです。

すいません、嘘付いていました。Web Essentials 2012 をインストールしておかないとメニューが表示されないようです。詳細は最後に追記しています。

ちなみに自分の環境では以下のようなメニューが表示されます。

実際に Twitter が提供している oEmbed API を実行した結果の JSON に対して試してみます。元になる JSON は以下の URL を叩けば取得できます。

https://api.twitter.com/1/statuses/oembed.json?id=355278734074454018

出力された JSON をコピーして、Visual Studio 2012 のエディタで「形式を指定して貼り付け」から「JSON をクラスとして貼り付ける」を選ぶと、以下のようなクラスが生成されます。

public class Rootobject
{
public string cache_age { get; set; }
public string url { get; set; }
public object height { get; set; }
public string provider_url { get; set; }
public string provider_name { get; set; }
public string author_name { get; set; }
public string version { get; set; }
public string author_url { get; set; }
public string type { get; set; }
public string html { get; set; }
public int width { get; set; }
}

JSON の値が null の場合は object、文字列の場合は string、整数の場合は int という感じに型付けされます。

さらに、このクラスと Json.NET を組み合わせると、非常に簡単にデシリアライズが出来るわけです。

// jsonValue は生 JSON データ
var result = JsonConvert.DeserializeObject<Rootobject>(jsonValue);

XML の場合は XmlSerializer ですぐに使える属性付きで生成されます。

機能の紹介はこれくらいにしておいて、この機能がどのタイミングで追加されたのかを確認しておきます。そもそも Web Essentials 2012 で Paste JSON as classes という名前で実装されたのが最初です。

Paste JSON as classes

When you have to work with JSON and especially JSON REST API’s, it can be time consuming and cumbersome to create all your C# classes after what an API is returning. With Web Essentials 2012, that is now very easy.

http://madskristensen.net/post/Web-Essentials-2012-released.aspx

今の Web Essentials 2012 では機能が削除されていますが、理由は ASP.NET and Web Tools 2012.2 RC で実装されたからです。*1

このあたりはチャックさんがブログで書いてくれていました。

※ “Paste JSON as classes” 機能について

この Web Essentials 2012 で実装されていた “Paste JSON as classes” という機能は、ASP.NET and Web Tools 2012.2 RC リリースで実装されることになったため、Web Essentials 2012 の Version 2.0 から削除されています。

http://blogs.msdn.com/b/chack/archive/2012/12/20/web-essentials-2012-visual-studio-2012-extention.aspx

同じくエバンジェリストのさとうなおきさんも、翻訳記事で ASP.NET and Web Tools 2012.2 の正式版でサポートされたと書かれてます。

HTMLエディターは、Knockoutバインディングに対するIntelliSenseを提供します。構文ハイライト、IntelliSense、検証を備えた、LESSファイルに対する第一級のサポートもあります。また、エディターは、JSONの.NETクラスとしての貼り付けもサポートします。JSONデータをクリップボードにコピーし、「形式を選択して貼り付け」コマンドを使ってC#/VBコード ファイルに貼り付けると、Visual StudioがJSONから推論される.NETクラスを自動生成します。

ASP.NET and Web Tools 2012.2のリリースを発表 – S/N Ratio

そして ASP.NET and Web Tools 2012.2 は Visual Studio 2012 Update 2 の先行リリースという扱いなので、Update 2 が正式版になったタイミングで、この機能も使えるようになっているはずです。

それに関しては Somasegar 氏も言及していますし、含まれていると考えていいでしょう。

And more, such as including all of the improvements made available through ASP.NET and Web Tools 2012.2.

http://blogs.msdn.com/b/somasegar/archive/2013/04/04/visual-studio-2012-update-2-now-available.aspx

ということで、メニューが出ない場合は以下のケースが考えられますね。

  • Visual Studio 2012 Update 2 / 3 をインストールしていない
  • ASP.NET and Web Tools 2012.2 もインストールしていない
  • プロジェクトの種類によっては表示されない?

プロジェクトの種類によってメニュー項目が表示されないのかもしれないですが、少なくとも自分の環境では Windows Store アプリでもクラスライブラリでも表示されていたので、依存していない気がします。

この機能は Web API 叩く時に凄く便利なので、使えるようにしておいた方が良いですね。

追記

Web Essentials 2012 から削除されて ASP.NET and Web Tools 2012.2 で実装されたという情報があったのですが、Web Essentials 2012 がインストールされていないとメニューが出ないようです。/(^o^)\ナンテコッタイ

酢酸先生も Web Essentials 2012 を入れることでメニューが出るようになったようです。しかし、Web Essentials 2012 には日本語リソースが用意されていないのに、何故このメニューだけ日本語で出るのか謎です。

ScottGu's Blog - Announcing release of ASP.NET and Web Tools 2012.2 Update

赤シャツも Web Essentials 2012 を入れないと使えないとか書いていないんですが…。とりあえず Web Essentials 2012 を入れましょう。「拡張機能と更新プログラム」から簡単に入ります。*2

*1:Web Essentials は VS に実装する前の機能が追加される

*2:Express Edition には非対応