SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

.NET FrameworkでJSONデータを処理する

DataContractJsonSerializerとDynamicJsonの使用方法

  • X ポスト
  • このエントリーをはてなブックマークに追加

.NET標準のDataContractJsonSerializerでのJSON処理

 それでは、以下のようなJSONデータについて、最初にDataContractJsonSerializerでの読み書きの方法を見ていきましょう。このJSONデータは友人情報を表しており、文字列データとしてNameとAddress、数値としてAgeというフィールドを含んでいます。

今回サンプルで扱うJSONデータ
{
  "Name":"Doi",
  "Address":"Tokyo",
  "Age":32
}

 なお、以降のコードは、配布サンプルのDataContractJsonSerializerSampleプロジェクトに含まれています。

参照設定

 まず、DataContractJsonSerializerを使用するための設定を行いましょう。DataContractJsonSerializerはSystem.Runtime.Serializationというコンポーネントに含まれるクラスです。このクラスは、Visual Studioのプロジェクトの作成の際に、WCFに関連するテンプレートを選択した場合などは、そのまま使用できますが、[コンソール アプリケーション]などのテンプレートでは参照設定を行う必要があります。

 Visual Studioの[プロジェクト]メニューから[参照の追加]を選択し、[.NET]タブから以下のように、System.Runtime.Serializationコンポーネントを選択して[OK]ボタンを押します。

[参照の追加]ウィンドウでSystem.Runtime.Serializationコンポーネントを追加
[参照の追加]ウィンドウでSystem.Runtime.Serializationコンポーネントを追加

 また、必要なusingステートメントをファイル先頭で以下のように宣言しておきます。

usingステートメント(Program.cs)
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

.NETクラスの定義

 DataContractJsonSerializerは、JSONを読み書きするためのライブラリというよりは、あくまでも.NETのクラスとJSONデータの相互変換を目的として準備されたライブラリです。そのため、JSONデータを扱う際には、JSONデータの構造に対応する.NETのクラスをあらかじめ定義しておく必要があります。先ほどのJSONデータに対応する.NETのクラスの定義は以下のようになります。

JSONデータに対応する.NETクラスの定義(Program.cs)
[DataContract]
public class FriendInfo
{
   [DataMember]
   public string Name{get;set;}
   [DataMember]
   public string Address { get; set; }
   [DataMember]
   public int Age { get; set; }
}

 ここでは、JSONデータのフィールドと同じ名前のName, Address, Ageプロパティを定義しています。なお、注意しなければならないのは、対象とするクラスにはDataContract属性を、プロパティにはDataMember属性を、それぞれ指定する必要がある点です。これらの属性はWCFでクラスを公開するために必要な属性で、データ・コントラクトと呼ばれます。データ・コントラクトの詳細については以下の記事を参照してください。

JSONデータの読み書き

 .NETクラスの定義ができれば、JSONデータの読み書きは簡単です。

 まずはJSONデータの読み込みを行ってみましょう。

JSONデータの読み込み(Program.cs)
//(1)読み込むJSONデータ
var jsonString = @"{""Address"":""Tokyo"",""Age"":32,""Name"":""Doi""}";

//(2)DataContractJsonSerializerをインスタンス化
var serializer = new DataContractJsonSerializer(typeof(FriendInfo));

//(3)JSONデータを文字列からバイト配列に変換
var jsonBytes = Encoding.Unicode.GetBytes(jsonString);

//(4)バイト配列を読み込むMemoryStreamクラスを定義
var sr = new MemoryStream(jsonBytes);

//(5)ReadObjectメソッドでJSONデータを.NETオブジェクトに変換
var obj = (FriendInfo)serializer.ReadObject(sr);

//(6)変換したオブジェクトのプロパティ内容を確認
Console.WriteLine("Name:{0}, Address:{1}, Age:{2}",
  obj.Name,obj.Address,obj.Age);

 実際にデータを読み込むのはDataContractJsonSerializerクラスのReadObjectというメソッドですが、このメソッドを使用するにはいくつかの前準備が必要になるので、順を追って見ていきましょう。

 (1)は読み込むJSONデータです。今回は文字列として定義していますが、もちろんWebサービスから取得したデータなどでも構いません。

 (2)では、DataContractJsonSerializerをインスタンス化しています。この際、変換対象とする型(今回はFriendInfoクラス)を引数に指定するのがポイントです。これにより、このインスタンスはJSONデータとFriendInfoオブジェクトの相互変換を行うように設定されます。

 (3)、(4)では、JSONデータの文字列をいったんバイト配列に変換した上で、それを読み込むMemoryStreamクラスを作成しています。これは、DataContractJsonSerializerがJSONデータを文字列としてではなく、Stream(.NETにおいて、ファイルや通信など連続するバイト列を表すクラス)として扱う仕様となっているためです。JSONデータを文字列として読み書きできないのはやや使いづらいですが、「.NETのクラスをJSONデータのWebサービスとして公開する」というDataContractJsonSerializerの本来の用途から考えると、こういった仕様になっているのは仕方ないところです。

 (5)では、DataContractJsonSerializerのReadObjectメソッドを使い、StreamからJSONデータを読み取り、.NETオブジェクトに変換しています。ReadObjectメソッドの返値はObject型なので、ここではFriendInfo型にキャストしています。

 (6)では、JSONデータから変換したFriendInfoオブジェクトの内容を確認しています。出力結果は以下のようになります。

JSONデータ読み込みサンプルの実行結果
Name:Doi, Address:Tokyo, Age:32

 (1)で定義したJSONデータがきちんと.NETのオブジェクトに変換されていることが分かります。

 一方、JSONデータの書き込みは以下のようなコードとなります。やはり書き込み先がStreamであるため、それに関わる部分を除けば、シンプルなコードです。

JSONデータの書き込み(Program.cs)
//DataContractJsonSerializerをインスタンス化
var serializer = new DataContractJsonSerializer(typeof(FriendInfo));

//変換する.NETオブジェクトを作成
var friend = new FriendInfo()
{
    Name = "Doi",
    Address = "Tokyo",
    Age = 32
};

//JSONデータを書き込むためのMemoryStreamを作成
var stream = new MemoryStream();
//(1)WriteObjectメソッドで.NETオブジェクトをJSONデータに変換
serializer.WriteObject(stream, friend);

//(2)書き込んだMemoryStreamの内容を出力
stream.Position = 0;
var reader = new StreamReader(stream);
Console.Write(reader.ReadToEnd());

 (1)では、DataContractJsonSerializerのWriteObjectメソッドを使い、.NETオブジェクトをJSONデータに変換しています。

 (2)ではJSONデータの確認を行うため、MemoryStreamの内容を出力しています。WriteObjectメソッドの書き込み先がMemoryStreamのため、StreamをReader(.NETにおいて、連続する文字列を表すクラス)に変換するためのStreamReaderクラスを使うなど、多少ややこしいコードとなっています。出力結果は以下のようになります。

JSONデータ書き込みサンプルの実行結果
{"Address":"Tokyo","Age":32,"Name":"Doi"}

 このように、DataContractJsonSerializerを使うことで、.NETオブジェクトとJSONデータの相互変換を行えます。事前に対応する.NETクラスの定義が必要なこと、読み書きはStreamを対象とすることに注意すれば、使用方法は簡単です。

次のページ
DynamicJsonでのJSON処理

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 土井 毅(ドイ ツヨシ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5868 2011/04/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング