2020/1/16追記
この記事を投稿してから5年が経過しましたが、
.NET Core 3.0から System.Text.Json が追加されました。
使用感はわかりませんが、Microsoft公式なのでこちらもご検討ください。
Json.NET
http://www.newtonsoft.com/json
C#.NETでJSONのパースを行うライブラリとして、
Json.NETを使ってみましたがとても便利です。
NuGetで導入できます。
シリアライズ
メソッドSerializeObject()を使う。
シリアライズ対象クラス(UserModel)
[JsonObject("user")]
public class UserModel
{
[JsonProperty("id")]
public int UserID { get; set; }
[JsonProperty("name")]
public string Username { get; set; }
}
シリアライズ処理
var data = new UserModel();
data.UserID = 100;
data.Username = "太郎";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
結果
{
"id": 100,
"name": "太郎"
}
デシリアライズ
メソッドDeserializeObject()またはDeserializeObject()を使う。
UserModel model1 = JsonConvert.DeserializeObject<UserModel>(jsonstring);
object model2 = JsonConvert.DeserializeObject(jsonstring);
サンプルでは単純なモデルクラスだが、
階層構造を持ったJSONでも問題なくデシリアライズ可能。
JSON配列もListなどにパースしてくれる。
便利なオプション機能
既定値(DefaultValue、DefaultValueHandling)
既定値を設定するにはSystem.ComponentModel名前空間のDefaultValue属性を利用する。
[JsonObject("user")]
public class UserModel
{
[JsonProperty("id")]
public int UserID { get; set; }
[JsonProperty("name")]
[DefaultValue("demo")]
public string Username { get; set; }
}
次に、列挙体DefaultValueHandlingでシリアライズ(デシリアライズ時)の既定値の取り扱い方法を制御します。
DefaultValueHandling
設定値 | 動作 |
---|---|
Include | シリアライズ時に既定値の項目をJSONに含める(既定の動作)。 |
Ignore | シリアライズ時に既定値の項目をJSONに含めない。 |
Populate | デシリアライズ時にJSON文字列中に要素が存在しない場合でも既定値を設定する。 |
IgnoreAndPopulate | IgnoreとPopulateの同時指定。 |
利用方法
プロパティ単位に指定するかシリアライズ(デシリアライズ)時にオプションで指定します。
// プロパティで指定
[JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Username { get; set; }
// シリアライズ時に指定
string json = Newtonsoft.Json.JsonConvert.SerializeObject(model, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore});
// デシリアライズ時に指定
UserModel model = JsonConvert.DeserializeObject<UserModel>(jsonstring, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Populate });
以上