今回はJSONファイルの読み込みについて紹介します。
『JSON(ジェイソン)ファイルってなんやねんっっ!!』って思っていた自分です。
ちょっとやり方に興味を持ったので紹介します。
とりあえず2パタンの読み込み方法を紹介します。
※使うパッケージが違うだけです。
JSONファイルとは?
JSONファイルとは、JavaScriptにおけるオブジェクトの表記法を応用したテキスト(文字)形式のデータファイル。JSONデータをそのままテキストファイルとして保存したもので、標準のファイル拡張子は「.json」。
JSON(JavaScript Object Notation)はプログラミング言語のJavaScriptで用いられていたデータ集合の記述形式を汎用のデータ形式として標準化(RFC 8259)したもので、様々なデータ型やデータ構造を組み合わせて複雑なデータ集合を定義できる。
JSONファイル(.jsonファイル)とは – 意味をわかりやすく – IT用語辞典 e-Words
すごく分かりやすく説明すると、【記載ルールの決まったテキストファイル】です。
初心者にも分かりやすくざっくり説明しているのは、下記サイトです。
JSONファイル (ジェイソンファイル)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 (i-3-i.info)
JSONファイルの書き方
読み込みに行く前に、記載方法を知っていると楽になるので説明します。
記載ルール
ルール①:
1つの塊ごとに波かっこ( {...} ) で括る
ルール②:
変数名、文字列は、ダブルクオーテーション( "" )で括る
ルール③:
キー[key]とバリュー[value]の間はコロン( : )で区切る
ルール④:
複数のキーとバリューを設定する場合は、カンマ( , )で区切る
ルール⑤:
配列にしたい場合は、角かっこ( [...] )で括る
サンプル
まずは、『名前はタロウです。』を作ってみます。
ココで言うと、[key = 名前(name)] [value = タロウ(Taro)]になります。
{ "name" : "Taro" }
まずは、ルール①に基づき{}で括ります。その後に変数(key,value)を””で括り、間は:で区切ります。
次に付け加えていきます。『名前はタロウです。年齢は36歳です。』とします。
[key = 年齢(age)] [value = 36]になります。
つながっていますので、1つの塊と考えて、複数のキーとバリューを定義します。
{ "name" : "Taro" , "age" : 36 }
さらに付け加えます。『グループAには、タロウ(36)とハナコ(28)です』
この場合、配列を使って表現します。
『 グループA(groupA)と言う配列に、
名前はタロウ、年齢は36歳と
名前はハナコ、年齢は28歳 』になるように記載します。
{ "groupA": [ { "name" : "Taro","age" : 36}, { "name" : "Hanako","age" : 28} ] }
このファイルをダウンロードはココをクリックしてください。
JSONファイルの読み込み
前置きが長くなりました。さっそく本題の読み込みを紹介します。
パッケージ[DynamicJson]を使用する
パッケージをインストールします。(パッケージのインストール手順はこちら)
※『dynamicjson』と検索してください
※インストール済みの為、緑のチェックマークがついています。
パッケージをインストールしたら、Namespaceを追加しましょう。
using Codeplex.Data;
次にファイルを読み込みます。
ファイル読み込みはSystem.IO.StreamReaderを使用します。
サンプルコードはこちらです。
読み込んだ文字列をjsonファイルの形式として変換します。
この時にdynamic型に変換されます。
private static void DispDynamicJson()
{
Console.WriteLine("jsonfile読込");
string sample = ReadFile();//補足を参考
Console.WriteLine("json形式に変換");
dynamic json = DynamicJson.Parse(sample);
Console.WriteLine("読み込み結果表示");
foreach (dynamic user in json.groupA)
{
Console.WriteLine("--------------------------------");
Console.WriteLine($"name={user.name}");
Console.WriteLine($"age={user.age}");
Console.WriteLine("--------------------------------");
//下記でも可
//Console.WriteLine("--------------------------------");
//Console.WriteLine(user["name"]);
//Console.WriteLine(user["age"]);
//Console.WriteLine("--------------------------------");
}
}
読み込んできたjsonファイルの文字列をそのままParse()する事で、変換(解析)する事が可能になります。
サンプルのファイルでは『groupA』と言う配列なので、そのエレメントでループを回しました。
残りは各Keyごとに読みだしています。
下記の記載方法でも読み出す事は可能です。
Console.WriteLine(json.groupA[0].name);
パッケージ[Newtonsoft.Json]を使用する ★オススメ★
パッケージをインストールします。(パッケージのインストール手順はこちら)
※『newtonsoft.json』と検索してください
※インストール済みの為、緑のチェックマークがついています。
パッケージをインストールしたら、Namespaceを追加しましょう。
※もしかしたら自動で追加されるかもしれません
using Newtonsoft.Json.Linq;
次にファイルを読み込みます。
ファイル読み込みはSystem.IO.StreamReaderを使用します。
サンプルコードはこちらです。
読み込んだ文字列をJsonファイルの形式として変換します。
JObjectクラスに変換します。
private static void DispNewtonsoftJson()
{
Console.WriteLine("jsonfile読込");
string sample = ReadFile();//補足を参照
Console.WriteLine("json形式に変換");
JObject jsonObj = JObject.Parse(sample);
Console.WriteLine("読み込み結果表示");
foreach (JObject user in jsonObj["groupA"].Cast<JObject>())
{
Console.WriteLine("--------------------------------");
Console.WriteLine($"name={user["name"]}"); //
Console.WriteLine($"age={user["age"]}"); //
Console.WriteLine("--------------------------------");
}
}
読み込んできたjsonファイルの文字列をそのままParse()する事で、変換(解析)する事が可能になります。
サンプルのファイルでは『groupA』と言う配列なので、そのエレメントでループを回しました。
残りは各Keyごとに読みだしています。
下記の記載方法でも読み出す事は可能です。
Console.WriteLine(jsonObj["groupA"][0]["name"]);
まとめ
JSONファイルの読み込みについてでした。
他にも方法がありそうでしたが、簡単にできそうな方法を紹介しました。
パッケージ[Newtonsoft.Json]を使用した方が処理としては早かったのでオススメとして紹介しています。多分ですが、Dynamic型は読みだすまでに時間がかかるのかもしれません。
配列の時の呼び出し方が分からず四苦八苦していました。
もし要素を呼び出しの際に例外が発生する場合は『ファイルの記載が間違っていないか?』をはじめに疑った方がいいと思います。
補足
パッケージのインストール方法
[ツール]⇒[NuGetパッケージマネージャー]⇒[ソリューションのNugetパッケージ管理]
[Nugetソリューション]のタブが開くので、[参照]
検索にパッケージ名を入力し、対象のパッケージを選択する。
パッケージをインストールするプロジェクトを選択し、[インストール]
確認が出てくるので[OK]
出力ウィンドウを確認する。
『正常にインストールされました』という文章が出力されています。
ファイル読み込み
今回のサンプルで使用している関数です。
private static string ReadFile()
{
string dt = "";
using (StreamReader sr = new StreamReader("(filepath)"))
{
dt = sr.ReadToEnd();
}
return dt;
}
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント