Help us understand the problem. What is going on with this article?

C#でJSONを扱うライブラリ「Json.NET」を使ってみました

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 });

以上

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした