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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

JSON

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

5130閲覧

JsonSerializerでList<ClassXX>をSerialize出来ない?

neuromancer

総合スコア72

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

JSON

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/06/20 19:40

編集2020/06/20 22:09

System.Text.Json で独自クラスのリストをSerializeしたのですが、中身が空っぽになってしまいました。
System.Text.Json は NuGet パッケージでインストールしてあります。

c#

1using System.Text.Json; 2using System.Text.Json.Serialization; 3/* 略 */ 4 5 public class Question 6 { 7 public string description; 8 public List<string> Options = new List<string>(); 9 public Question() { } 10 } 11 12/* 略 */ 13 var qs = new List<Question>(); 14 /* qsに色々入れる */ 15 var j = JsonSerializer.Serialize<List<Question>>(qs);

この結果、jの中身は

"[{},{}]"

です。
Listには2つQuestionを入れたので、中身2つのListだよ、というところまでは認識している様子ですが、
中身が空っぽになってしまいました。
何が足りないのでしょうか?

その後:
.Net Framework 4.7.2
.NET Core 3.1
で、同じことを試した結果、上記と同じ結果になりました。

さらに試した事:

c#

1 var j1 = JsonSerializer.Serialize<List<Question>>(qs); 2 var j2 = JsonSerializer.Serialize<Question[]>(qs.ToArray()); 3 var j3 = JsonSerializer.Serialize<Question>(qs[0]); 4 var j4 = JsonSerializer.Serialize<Object>(qs[0]); 5 var j5 = JsonSerializer.Serialize(qs[0]); 6 var j6 = JsonSerializer.Serialize(qs);

これら全て空になりました。

コンソールアプリ .NET Core 3.1 で書き直したものはこちらです。

c#

1namespace ConsoleApp2 2{ 3 public class Question 4 { 5 public string description; 6 public List<string> Options = new List<string>(); 7 public Question() { } 8 } 9 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 var qs = new List<Question>(); 15 /* qsに色々入れる */ 16 var q = new Question(); 17 q.description = "aa"; 18 q.Options = new List<string> { "a11", "a12", "a13", "a14", }; 19 qs.Add(q); 20 q = new Question(); 21 q.description = "bb"; 22 q.Options = new List<string> { "b11", "b12", "b13", "b14", }; 23 qs.Add(q); 24 25 var j = JsonSerializer.Serialize<List<Question>>(qs); 26 var j2 = JsonSerializer.Serialize<Question>(qs[0]); 27 var j3 = JsonSerializer.Serialize(qs); 28 var j4 = JsonSerializer.Serialize(qs[0]); 29 Console.WriteLine(j); 30 Console.WriteLine(j2); 31 Console.WriteLine(j3); 32 Console.WriteLine(j4); 33 } 34 } 35}

環境: Windows 10, Microsoft Visual Studio Community 2019, .Net Framework 4.6.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/20 21:02

Unity は分からないのでハズレかもしれませんが、Core 3.0 以降でないと使えないと言うことはありませんか?
neuromancer

2020/06/20 21:07

Office VSTO アドインを作っていますが、 ビルドが通るのに使えないという事があるんでしょうか?
neuromancer

2020/06/20 21:11

すみません、書き忘れました。 System.Text.Json NuGet パッケージをインストールしました。
退会済みユーザー

退会済みユーザー

2020/06/20 21:21 編集

そこからリンクが張ってある System.Text.Json のページに飛んで、左側に表示されている「バージョン」で .NET Framework を選択してみてください。出てこないはずです。 ちなみに、ASP.NET では Core 3.x 以降で使うようになり、.NET Framework および Core 2.x 以前では Newtonsoft.Json が使われます。が、Unity は分かりません。
退会済みユーザー

退会済みユーザー

2020/06/20 21:34 編集

質問には .NET 4.6.1 と書いてありましたが? ただ、自分は .NET で試したことはありませんし、まして Unity は分かりませんので、本来ここでレスする立場にないのですが・・・
neuromancer

2020/06/20 21:32

「.NET Standard 2.0 以降のバージョン」 というのは、4.6.1も含まれるものと思っていますが、意味が違うのでしょうか?
neuromancer

2020/06/20 21:33

あ、間違えました「4.7.2 以降のバージョン」ですね。 含まれないですね。 すみません。4.7.2にしてみます。
退会済みユーザー

退会済みユーザー

2020/06/20 21:52

Unity の話と思い込んでいましたが、私の思い違いだったでしょうか。単純な .NET のコンソールアプリでも同じ結果ですか?
neuromancer

2020/06/20 21:54

.NET Core 3.1 でも同じ結果になってしまいました。やはりプログラムに何か足りないようです。
neuromancer

2020/06/20 21:55

そうですね。コンソールアプリでも同じです。
退会済みユーザー

退会済みユーザー

2020/06/20 21:59

コンソールアプリなら全部コードはアップできるでしょうから、問題が再現できる必要最低限かつコピペすれば動く完全なサンプルコードを質問欄を編集してアップすることをお勧めします。
neuromancer

2020/06/20 22:05

そうですね。そうします。ありがとうございます。
neuromancer

2020/06/20 22:22

解決しました。 各フィールドに  { get; set; } を追加したところ。 期待通りになりました。
退会済みユーザー

退会済みユーザー

2020/06/20 22:26

フィールドではなくプロパティでないとダメだったということですね。 解決した方法を自分で解答欄に書いてこのスレッドはクローズしていただくようお願いします。
guest

回答1

0

自己解決

解決しました。
各フィールドに  { get; set; } を追加したところ。
期待通りになりました。

投稿2020/06/20 22:27

neuromancer

総合スコア72

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

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

退会済みユーザー

退会済みユーザー

2020/06/20 22:49

その表現は、違うとまでは言えないまでも、適切ではないと思います。「フィールドに代えてプロパティを使用」とした方が適切です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問