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

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

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

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

Q&A

解決済

2回答

1944閲覧

C# JsonSerializer 例外

Rabitttt

総合スコア17

C#

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

0グッド

0クリップ

投稿2022/08/11 00:38

前提

環境:Windows10 C# .NET4.8

ここに質問の内容を詳しく書いてください。
JsonSerializerを使用してサンプルプログラムを作成していて
var json_str = JsonSerializer.Serialize(gil)で
例外が発生しました。

実現したいこと

JsonSerializerを使用してサンプルプログラムを作成しています。
シリアライズ、デシリアライズをしたいです。
解決方法をご教授お願いします。

発生している問題・エラーメッセージ

``
System.IO.FileNotFoundException: 'ファイルまたはアセンブリ 'System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。'

FileNotFoundException: ファイルまたはアセンブリ 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

### 該当のソースコード ```ここに言語名を入力 using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Text.Json; using System.Text.Json.Serialization; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; private void button2_Click(object sender, EventArgs e) { Member gil = new Member(); gil.No = 2; gil.Name = "横田知子"; gil.Gender = "女"; gil.Age = 20; var json_str = JsonSerializer.Serialize(gil);//例外発生 } public class Member { public int No; public string Name; public string Gender; public int Age; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

サンプルページ
https://yaspage.com/cs-json-serialize/
ここにより詳細な情報を記載してください。

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

退会済みユーザー

退会済みユーザー

2022/08/11 00:46

System.Text.Json の JsonSerializer が使えるのは .NET Core 3.0 以降で、それより前のフレームワーク (.NET Framework 4.8 を含む) では NuGet からのインストールが必要だそうですが、それはやりましたか?
guest

回答2

1

ベストアンサー

System.Text.Json の JsonSerializer が使えるのは .NET Core 3.0 以降で、それより前のフレームワーク (.NET Framework 4.8 を含む) では NuGet からのインストールが必要だそうですが、それはやりましたか?

質問者さんのコードをコピペして試してみましたが、System.Text.Json を NuGet からインストールしてあれば少なくとも質問に書いてあるような例外は出ません。

イメージ説明

ただし、別の問題があって結果が {} になってしまいますが。Member クラスの定義にフィールドではなくプロパティを使えば期待通りになります。

試したコードを載せておきます。

using System; using System.Text.Json; namespace ConsoleAppSystemTextJson { internal class Program { static void Main(string[] args) { Member gil = new Member(); gil.No = 2; gil.Name = "横田知子"; gil.Gender = "女"; gil.Age = 20; var json_str = JsonSerializer.Serialize(gil); Console.WriteLine(json_str); } } public class Member { public int No { get; set; } public string Name { get; set; } public string Gender { get; set; } public int Age { get; set; } } }

結果は:

イメージ説明


【追記】

上の結果で日本語の部分が \uxxxx という形で表されるのは、シリアライザで Unicode Escape Sequence (以下 UES と書きます) という形にエスケープされた結果です。

セキュリティ対策のようで、そのままでもその JSON 文字列を使う側は問題なく解釈してくれると思いますが、どうしても読めないとイヤだという場合は以下のように JsonSerializerOptions の設定でエスケープしないようにできます。

var option = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) }; var json_str = JsonSerializer.Serialize(gil, option);

結果は:

イメージ説明

なお、上の方法でエスケープしないようにできるのは BMP(Basic Multilingual Plane・・・U+0000 から U+FFFF の範囲)の文字だけです。BMP の文字でもエスケープ解除できないものもあります。詳しくは以下の記事を見てください。

ASP.NET Core MVC の Unicode Escape Sequence (UES)
http://surferonwww.info/BlogEngine/post/2020/03/11/aspnet-core-mvc-controller-json-method-replaces-non-ascii-characters-with-5cuxxxx.aspx

投稿2022/08/11 01:08

編集2022/08/19 21:53
退会済みユーザー

退会済みユーザー

総合スコア0

TN8001👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

Rabitttt

2022/08/11 07:58

ありがとうございます。解決しました。 NuGetからインストールしたことで例外はなくなりました。 修正内容までありがとうございます。 プロパティ、オプション追加することで正常になりました。 ご教授ありがとうございました。
Rabitttt

2022/08/11 08:14

度々すみません。 .NET Core 3.0 以降しか >System.Text.Json の JsonSerializer が使えるのは .NET Core 3.0 以降で、それより前のフレームワーク >(.NET Framework 4.8 を含む) では NuGet からのインストールが必要だそうですが、それはやりましたか? 上記の(.NET Framework 4.8 を含む) では NuGet からのインストールが必要というのは どこに掲載されていますか? Microsoftで確認しましたら .NET Core 3.0 以降とは書いていましたが、、 ご教授お願いします。
Rabitttt

2022/08/11 09:51

ありがとうございます。 了解しました。
guest

1

Visual Studio 2019 から参照設定できる System.Text.Json(.NET 4.0 用) ですが、
参照設定に
System.Buffers
System.Runtime.CompilerServices.Unsafe
System.ValueTuple
を追加すると動作します。(System.Runtime.CompilerServices.Unsafe だけでも良いらしい)
https://teratail.com/questions/fr7krbphin7mxk

ただし、
「Visual Studio 2019 の頒布可能コード」
https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/redistribution
には含まれないので、nuget で System.Text.Json を取得してください。

投稿2022/08/11 01:00

KOZ6.0

総合スコア2464

Rabitttt👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

Rabitttt

2022/08/11 08:02

nugetからDLLを取得することで 解決しました。 ご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.69%

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

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

質問する

同じタグがついた質問を見る

C#

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