読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

C# による JSON 相互変換 (Json.NET 利用)

C# JSON

概要

以下について解説する。

  • C# オブジェクトを JSON テキストに変換する方法
  • JSON テキストを C# オブジェクトに変換する方法

今回のサンプル

GitHubVisual Studio プロジェクトを上げてあります。

使うライブラリ

プロジェクトの References (参照) に「Json.NET」を追加する。
f:id:kobake:20160826143558p:plain:w300
f:id:kobake:20160826143244p:plain:w500

実際に References (参照) ツリー上に表示される名前は Newtonsoft.Json ってなるっぽい。
f:id:kobake:20160826143604p:plain:w300

今回扱うモデル

とりえずシンプルなモデルで。

class Book
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string Asin { get; set; }
}

C# オブジェクトを JSON テキストに変換

変換コード

using using System.Collections.Generic;
using using Newtonsoft.Json;
....
// 日本語ちゃんと出力されるようにしておく
Console.OutputEncoding = new UTF8Encoding();

// せっかくだからリスト構造を作ってみる
List<Book> books = new List<Book>
{
  new Book{ Id = 1, Name = "野望の王国 1", Asin = "B00M84FTOS"},
  new Book{ Id = 2, Name = "アカギ 1", Asin = "B00DVYTZ12"},
};

// 普通の JSON テキスト構築
Console.WriteLine("-------- normal json --------");
string jsonString = JsonConvert.SerializeObject(books);
Console.WriteLine(jsonString);

// インデント付きの JSON テキスト構築
Console.WriteLine("\n-------- formatted json --------");
string formattedJson = JsonConvert.SerializeObject(books, Formatting.Indented);
Console.WriteLine(formattedJson);

変換結果

-------- normal json --------
[{"Id":1,"Name":"野望の王国 1","Asin":"B00M84FTOS"},{"Id":2,"Name":"アカギ 1","Asin":"B00DVYTZ12"}]

-------- formatted json --------
[
  {
    "Id": 1,
    "Name": "野望の王国 1",
    "Asin": "B00M84FTOS"
  },
  {
    "Id": 2,
    "Name": "アカギ 1",
    "Asin": "B00DVYTZ12"
  }
]

デバッグ時などはインデント付いてるほうが見やすくて良い。

JSON テキスト を C# オブジェクトに変換

変換コード

using using System.Collections.Generic;
using using Newtonsoft.Json;
....
// 日本語ちゃんと出力されるようにしておく
Console.OutputEncoding = new UTF8Encoding();

// JSON テキストのサンプル (書式はあえて適当に崩した)
string jsonSample = @"[
  { ""Id"": 10, ""Name"": ""フェルマーの最終定理"", ""Asin"": ""4102159711"" },
  {
    ""Asin"": ""410215972X"",
    ""Name"" : ""暗号解読"", ""Id"": 20
  }
]";

// JSON テキストから C# オブジェクトを構築
List<Book> booksByJson = JsonConvert.DeserializeObject<List<Book>>(jsonSample);

// 結果確認用出力
Console.WriteLine("-------- parse json result --------");
booksByJson.ForEach((book) => {
  Console.WriteLine(book.Id + ", " + book.Name + ", " + book.Asin);
});

変換結果

-------- parse json result --------
10, フェルマーの最終定理, 4102159711
20, 暗号解読, 410215972X

おわり

Json.NET 使いやすいですね。
実際には入力 JSON 書式に誤りがあったりすると例外発生するので try~catch は付けたほうが良いです。

謝辞

@qwerty2501さん、@xxIN0xxさん、Json.NET の情報ありがとうございました!

宣伝

唐突ですがサンプルJSONに書いた「暗号解読」が糞おもしろいのでお勧めしておきます。(というかサイモン・シンの本はすべてガチでおもしろい)(今回のテーマにはまったく関係ない)

暗号解読〈上〉 (新潮文庫)

暗号解読〈上〉 (新潮文庫)

});