概要
こんなTweetを見かけたので、さっそくやってみた。
VisualStudioにはJSONをクラスとして貼り付けるという機能があるよ、と。
Tip of the Day! A little reminder of the paste JSON as classes feature in Visual Studio :) There is also 'paste XML as classes' pic.twitter.com/O79D6ZEuwl
— Iris Classon (@IrisClasson) November 27, 2016
用意したJSON
{
"title":"Harry Potter and the Philosopher's Stone",
"author":"J.K. Rowling",
"hoge": {
"stringField": "piyo",
"numField": 123,
"floatField": 20.315,
"boolField": false
},
"tags": ["novel", "story", "magic"],
"valiableTags": [123, false, "str"],
"intArray": [1, 2, 3, 4, 5],
"floatArray": [1.2, 1.3, 1.4, 2.0],
"date": "2016/11/29T12:34:56.000",
"year":"1997"
}
変数 | 意図 |
---|---|
hoge | ネストした場合はどうなるか |
numField | 数値型がどうなるか |
floatField | 小数点を含む数値の場合どうなるか |
boolField | 真偽値の場合どうなるか |
tags | stringの配列だとどうなるか |
valiableTags | stringだけでなく、いろんなオブジェクト型が混在する場合どうなるか |
intArray | intの配列だとどうなるか |
floatArray | floatの配列だとどうなるか |
date | 日付を表す文字列だとどうなるか ※日付の書式については、詳細は下の方に追記あり |
year | 数値だけども、文字列として書かれた場合どうなるか |
いざ、実践
試した環境は、VisualStudio2015 CommunityEditionです。
[編集]-[形式を選択して貼り付け(s)] から[Paste JSON As Classes]を選択します。
貼り付けると、こんなコードが生成されました。
public class Rootobject
{
public string title { get; set; }
public string author { get; set; }
public Hoge hoge { get; set; }
public string[] tags { get; set; }
public object[] valiableTags { get; set; }
public int[] intArray { get; set; }
public float[] floatArray { get; set; }
public string date { get; set; }
public string year { get; set; }
}
public class Hoge
{
public string stringField { get; set; }
public int numField { get; set; }
public float floatField { get; set; }
public bool boolField { get; set; }
}
[追加] DateTimeの確認
コメントでDateTimeもいけました、と。こんなクソみたいな記事にコメントいただけてありがたい限りです。
WikipediaのISO_8601の項目を参考に、以下の文字列を試してみた。
{"date": "2016-11-29T12:00:00.000",
"date1": "2016-11-29T12:00:00.000Z",
"date2": "2016-11-29T12:00:00.000+09:00",
"date3": "2016-092",
"date4": "2016-11",
"date5": "20161129",
"date6": "2016-11-29",
"date7": "2016-W14-4"
}
おそらくISO8601に従っていて、日付、時間までそろっていればよさげ。
まとめ
- ルートはRootobjectという名前になり、ネストされているオブジェクトもクラスになる
- string, int, float, boolといった基本的な型についてはOK
- 日付の文字列については、ISO8601の形式にあわせればDateTimeになる
- 複数要素がある場合、配列として宣言される
- 配列の中身が同じ型で、かつ基本的な型であれば、その型の配列になる
- 異なるオブジェクトが混在する配列だと、object型の配列になる
すでにあるJSONから、モデルの生成などに使えるかも。
たとえば、誰かが作ったelasticsearchのtypeの検索結果から、NESTで使用する際に使うオブジェクトの生成とか。