.net column
.NET開発者のためのブログメディア

C#でJSONを扱う方法について解説!C#でJSONを使いこなせるようになろう

2020年10月29日
SE
JSONという技術があることを始めて聞きましたが、どのような技術なのでしょう。
PM
JSONはC#でも使えるデータ交換フォーマットのことです。

C#によるJSONとは?


JSONという技術をご存じでしょうか?JSONとはJavaScript Object Notationの略ですが、JavaScript以外の言語でも使えるシンプルなデータ交換フォーマットです。

データ交換フォーマットは他にはXMLが有名ですが、JSONはXMLと違いテキストデータに特化していません。

また型・配列・nullといったXMLにない機能があるため、プログラム処理との親和性が高いです。C#はこのJSONをとても簡単に扱うことができます。

JSONの基礎その1

C#でのJSONの扱い方を解説する前に、JSONの概要について簡単に説明します。JSONは以下のような形式でデータを扱います。

{
“name”: “Ramen”, “price”: 500,
“name”: “Miso Ramen”, “price”: 600
}

以下のように値がないことを示すnullを使用できます。

{ “name”: null, “price”: null }

以下のようなtrue/falseといった真偽値も使えます。

{ “ajitama_tsuika_flag”: true }

JSONの基礎その2

以下のような配列を持つこともできます。ここまで紹介した機能はXMLにはないため、それらが必要ならJSONを使う意義があるといえます。

{
“tsuika”: [ “Negi”, “Nori”, “Ninniku” ],
}

以下のような階層構造にもできます。これに関してXMLはかなり得意です。

{
“ramen_info”: {
“men”: “Futo Men”,
“soup”: “Tonkotsu”
}
}

以上のように、JSONはシンプルでかつ豊富な機能を持っているため広く普及しています。

C#でのJSONの扱い方

それではC#でJSONを扱う方法を解説します。上記の例に記載されているラーメンの名前と価格をJSONのデータにしましょう。

なおこのページのC#サンプルを実行する場合は、ソースの先頭に、

using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

を追加してください。ではまず、以下のようなクラスを作りましょう。

class Ramen
{
[JsonPropertyName(“name”)] public string Name { get; set; }
[JsonPropertyName(“price”)] public int Price { get; set; }
}

JSON形式にシリアライズする

上のC#サンプルのRamenはNameとPriceというプロパティを持つシンプルなクラスです。

属性のJsonPropertyNameは見慣れないと思いますが、これでJSONにした時のキー名を変更できます。これがないとJSONのキー名は、プロパティ名と同じ先頭が大文字のNameやPriceになってしまいます。

JsonPropertyNameで、nameやpriceのように先頭を小文字に変更できるのです。そして以下がJSONをシリアライズするC#サンプルです。

public static void Main()
{
List <Ramen> ramen = new List<Ramen>();
ramen.Add(new Ramen { Name = “Ramen”, Price = 500 });
ramen.Add(new Ramen { Name = “Miso Ramen”, Price = 600 });

string jsonStr = JsonSerializer.Serialize(ramen);
Console.WriteLine(jsonStr);
}

シリアライズはデータを実体化すること

シリアライズとは、プログラム上のデータを、文字列やテキストファイルやバイナリファイルと言った実体のある形式に変換することです。

上のC#サンプルではRamenクラスのデータをListに格納し、それをJsonSerializer.SerializeでJSON形式の文字列にしています。実行結果は以下になります。

[{“name”:”Ramen”,”price”:500},{“name”:”Miso Ramen”,”price”:600}]

JSONのデータをデシリアライズする

では次はデシリアライズをしましょう。デシリアライズとはシリアライズの逆で、文字列などのデータをプログラム上のデータに変換することです。

以下を上のC#サンプルに追加してください。

List<Ramen> ramenData = JsonSerializer.Deserialize<List<Ramen>>(jsonStr);
ramenData.ForEach(ramen =>
{
Console.Write(ramen.Name + ” “);
Console.WriteLine(ramen.Price);
});

デシリアライズも簡単にできる

JSONデータの文字列を、JsonSerializer.DeserializeでRamen型を格納したList型にデシリアライズしています。そして繰り返し処理を行うForEachと=>を使ったラムダ式で、中身を表示しています。

上のC#サンプルを実行すると、

Ramen 500
Miso Ramen 600

と表示されます。なお今回はRamenというクラスを自作しましたが、匿名クラスや既存のDictionaryクラスを使っても、JSONを扱うことはできます。

ただしそれらはキー名の重複ができません。キーを使う場合は、今回のように自作クラスを作るべきでしょう。

JSONの配列を使う方法

C#でJSONの配列を使うにはどうしたらよいのでしょうか。上のC#サンプルのRamenクラスに以下のList型のフィールドを追加しましょう。

[JsonPropertyName(“tuika”)] public List<string> Tuika { get; set; }

これで以下のように配列データを扱うことができます。

List <Ramen> ramen = new List<Ramen>();
ramen.Add(new Ramen { Name = “Ramen”, Price = 500, Tuika = new List<string> { “Ajiama”, “Negi” } });

シリアライズした結果は以下になります。

[{“name”:”Ramen”,”price”:500,”tuika”:[“Ajiama”,”Negi”]}]

JSONの階層構造を使う方法

C#でJSONの階層構造を使うにはどうすればよいのでしょうか。やり方は、まずここまでのサンプルに以下のクラスを追加してください。

class Ramen_Info
{
[JsonPropertyName(“men”)] public string Men { get; set; }
[JsonPropertyName(“soup”)] public string Soup { get; set; }
}

そしてRamenクラスに以下のInfoプロパティを追加します。

[JsonPropertyName(“ramen_info”)] public Ramen_Info Info { get; set; }

別のクラスを作れば階層化できる

これで以下のように階層化できるようになります。

List <Ramen> ramen = new List<Ramen>();
ramen.Add(new Ramen { Name = “Ramen”, Price = 500, Info = new Ramen_Info { Men = “Futomen”, Soup = “Tonkotsu” } });

シリアライズした結果は以下になります。ramen_infoのデータがサブ階層になっていますね。

[{“name”:”Ramen”,”price”:500,”ramen_info”:{“men”:”Futomen”,”soup”:”Tonkotsu”}}]
SE
JSONは思ったよりも簡単に使えそうですね。
PM
JSONはシンプルでかつ豊富な機能を持っています。XMLとあわせて扱い方を理解すれば、テキストデータのやり取りはマスターしたといえます。

C#でJSONを使いこなそう

C#のJSONの扱い方を解説しましたが、ご理解頂けましたでしょうか。

思ったより簡単にできることが分かったと思います。JSONとXMLの扱い方を理解すれば、C#のテキストデータのやり取りはマスターしたといえるでしょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags