質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

2回答

9684閲覧

JSON.NET 規定値の設定の仕方

makoyang

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2017/05/16 02:01

###目的
JSON.NETを使用してserializeする際にプロパティに対して規定値を設定したい。

###問題
serializeして結果を見てみると規定値が設定してあるはずのプロパティがnullになっている。
nullではなく規定値を設定したい。

###ソースコード

UserModel.cs

C#

1using Newtonsoft.Json; 2using System.ComponentModel; 3 4namespace JsonTest 5{ 6 [JsonObject("user")] 7 public class UserModel 8 { 9 [JsonProperty("id")] 10 public int UserID { get; set; } 11 [JsonProperty("name")] 12 public string Username { get; set; } 13 [JsonProperty("bloodType", DefaultValueHandling = DefaultValueHandling.Include)] 14 [DefaultValue("A")] 15 public string BloodType { get; set; } 16 } 17}

Program.cs

C#

1using System; 2 3using Newtonsoft.Json; 4 5namespace JsonTest 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 DeserializeSample(SerializeSample()); 12 } 13 14 static string SerializeSample() 15 { 16 var data = new UserModel(); 17 data.UserID = 100; 18 data.Username = "太郎"; 19 20 string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(data); 21 22 Console.Write($"{serializedJson}\n"); 23 24 return serializedJson; 25 } 26 27 static void DeserializeSample(string jsonstring) 28 { 29 UserModel model1 = JsonConvert.DeserializeObject<UserModel>(jsonstring); 30 31 Console.Write($"model1.UserID = {model1.UserID}\n"); 32 Console.Write($"model1.Username = {model1.Username}\n"); 33 Console.Write($"model1.BloodType = {model1.BloodType}\n"); 34 } 35 } 36} 37

###実行結果

{"id":100,"name":"太郎","bloodType":null} model1.UserID = 100 model1.Username = 太郎 model1.BloodType =

bloodTypeがAになってほしいのですが...。

###開発環境

  • OS Windows10 professional x64
  • IDE VisualStudio2017 community
  • 言語 C#
  • プロジェクト形式 コンソールアプリ(.NET framework)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

JSONの問題ではなく、プロパティのデフォルト値の問題が気がするのですが。

C#

1 public string BloodType { get; set; } = "A";

で良いのでは?

投稿2017/05/16 02:27

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makoyang

2017/05/16 02:36

う~ん、そうですよねぇ。 私もそう考えたのですが、じゃあそもそもDefaultValueとかDefaultValueHandlingとかは、 そもそもこの様な用途に使うものじゃないって事なのでしょうか...? 以下のサイトを参考にしていました。(”規定値”のところです) http://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76
ebiryo

2017/05/16 02:44

hidoriさんが指摘されているように、 "bloodType":null と出力されているのなら、nullがbloodTypeの値になるわけですからデフォルト値とか関係ないと思うのですが。 DefaultValueHandlingとかDefaultValueが効果を発揮するのは出力結果が { "UserID":100, "Username":"太郎" } のような場合だと思います。
makoyang

2017/05/16 03:00

なにか私が勘違いしているような気がしてきました。 ちょっと確認させてください。 上記のSerializeSampleメソッドでUserModelを作成した後で data.UserID = 100; data.Username = "太郎"; とBloodTypeは設定しないでserializeしています。 このserialize時に規定値が設定されるような仕組みがDefaultValueとかと思っていたのですが、 これがそもそも間違っているのでしょうか。
makoyang

2017/05/16 04:51

>ebiryoさん なるほど、やはり私が勘違いしていたみたいです。 頂いたURLを見てみました。私と同じように勘違いする人をベースに書いてあって参考になりました。 >hihijijiさん おお、動きは理解できました。 が、serializeの時のIncludeとかIgnoreってどんな時に使われるのでしょうか...。
hihijiji

2017/05/16 05:16

単純に、値の 0 や null が意図したものなのか、未設定状態なのかで出力するか否かを決めたら良いと思います。
makoyang

2017/05/16 06:05

あ...そうですよね。 有難うございます。
guest

0

ベストアンサー

string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(data);

の時点で JSON に

"bloodType":null

が出力されていたりはしませんか?

投稿2017/05/16 02:19

hidori

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makoyang

2017/05/16 02:25

そうなんです。 DefaultValueHandling.Includeとしているので、 JSONにserializeする時点でnullではなくて"A"が入ってほしいのですが。
hidori

2017/05/16 02:29

そこが問題なら、null 値が JSON に出力されないよう、シリアライズ時の JSON.NET にオプションを指定してください。 ```DefaultValueHandling.Include``` が効果を発揮するのは、デシリアライズ対象の JSON に bloodType フィールドが含まれていない場合のはずです。
makoyang

2017/05/16 02:50

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm ここを見てみると DefaultValueHandling.Includeの説明に「Has no effect when deserializing.」となっていますが...。 ちなみに ```C# static string SerializeSample() { var data = new UserModel(); data.UserID = 100; data.Username = "太郎"; //string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(data); string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(data, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include }); Console.Write($"{serializedJson}\n"); return serializedJson; } ``` これもやってみましたが、ダメでした。
hidori

2017/05/16 04:09 編集

```cs# [JsonObject("user")] public class UserModel { [JsonProperty("id")] public int UserID { get; set; } [JsonProperty("name")] public string Username { get; set; } [JsonProperty("bloodType", DefaultValueHandling = DefaultValueHandling.Populate)] [DefaultValue("A")] public string BloodType { get; set; } } void Main() { var json = @"{""id"":1, ""name"":""davec""}"; var model = JsonConvert.DeserializeObject<UserModel>(json); Console.WriteLine(model.BloodType); } ``` でどーですか?
hidori

2017/05/16 04:13 編集

>JSONにserializeする時点でnullではなくて"A"が入ってほしいのですが。 というのは、「オブジェクトインスタンスでは BloodType = null だけど、そのオブジェクトのシリアライズ出力には BloodType = 'A' であってほしい」ということですか? だと、ちょっと JSON.NET に期待するのは間違いなような気が。。カスタムなシリアライズ動作を自分で定義することも可能だったような気もしますが、そんなことをするくらいなら、別コメントにあるように初期化した方がシンプルな気がします。
makoyang

2017/05/16 04:36

hidoriさん、有難うございます。先ほどのサンプルコードで DefaultValueHandling.Populate については理解できました。最後の回答についても理解できました。 ただ、よくわからないのが DefaultValueHandling.include DefaultValueHandling.Ignore はどのようなケースで使われるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問