🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

8900閲覧

C#のSystem.Text.JsonのJsonSerializerでシリアル化したときに全角スペースが文字コードで表示されないようにしたい

abroad128

総合スコア60

C#

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

0グッド

0クリップ

投稿2021/01/27 06:20

編集2021/01/27 06:28

下記コードで全角スペースを含む文字列 "あ い" をシリアライズすると "あ\u3000い" となるのですが,あとで置換する以外に全角スペースをそのままの形で表示する方法はありますか?
もしくは何故このようになるのかを知りたいです.

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Text.Encodings.Web; 6using System.Text.Json; 7using System.Text.Unicode; 8using System.Threading.Tasks; 9 10namespace ConsoleApp1 11{ 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 var option = new JsonSerializerOptions 17 { 18 Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) 19 }; 20 21 var jsonstr = JsonSerializer.Serialize("あ い", option); 22 23 Console.WriteLine(jsonstr); 24 Console.Read(); 25 } 26 } 27} 28 29

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

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

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

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

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

guest

回答1

0

ベストアンサー

打ち消し線~~~~勘違いしてました。取り消します

取り消してから再確認しましたが、質問者さんのケースでは文字列を JSON にシリアライズするという普通はあり得ないことをしているという、やり方のではないかと思います。

またまた失礼しました。それも違いました。U+3000 はその通りでした。その隣の U+3001 とか U+3002 はエスケープされないのですが・・・ 調査してみます。

【追伸】

そういう仕様らしいです。以下の記事の GrabYourPitchforks さんの回答を見てください。

Can't serializ the '\u3000' when using with UnicodeRanges.All
https://github.com/dotnet/docs/issues/22147

Space_Separator [Zs] category に属する [\u0020\u3000\u1680\u2000-\u2006\u2008-\u200A\u205F\u00A0\u2007\u202F] は U+0020 (半角空白) 以外はブロックされるそうです。理由は "their potential to cause problems or errors in consuming applications." だそうです。(JSON 文字列に過ぎないのにエスケープすると何故 "problems or errors" が避けられるのかは個人的には納得いきませんが)

投稿2021/01/27 06:58

編集2021/01/27 08:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TN8001

2021/01/27 09:56

これを真っ当に回避しようとすると、Encoderを自作するしかないということでしょうか? [Utf8JsonWriterがエスケープする文字を自作JavaScriptEncoderで減らしたい - プログラム系統備忘録ブログ](https://tan.hatenadiary.jp/entry/2019/10/25/203334 さっぱりわからないし、後から置換しちゃえば?みたいな気分になりますね。。。(@"あ い\u3000"みたいなのを考えるとめんどくさいか?) 全角空白に引っかかったみたいな記事が、全く見つからないのに驚きました^^;
退会済みユーザー

退会済みユーザー

2021/01/27 11:36

どうしてもということなら Newtonsoft.Json を使ってはいかがですか。実際 .NET Core MVC や Web API では、Core v2.x 以前は Newtonsoft.Json が使われていたそうです。(System.Text.Json 名前空間の JsonSerializer クラスが使われるようになったのは ASP.NET Core v3.x 以降)
TN8001

2021/01/27 11:55

ありがとうございます。 まあそれはわかっているのですが、今後はSystem.Text.Json使っていきたいと考えていましたので地味に気になる挙動です。 当該issueの https://github.com/dotnet/docs/issues/22147#issuecomment-763209809 をいいねしておきましたが、簡単に回避できるようになればいいですねぇ。
退会済みユーザー

退会済みユーザー

2021/01/27 12:21

HTML-sensitive characters within the ASCII-range もエスケープは回避できないようです。 Serialization behavior https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?view=netcore-3.1&pivots=dotnet-5-0#serialization-behavior U+3000 は初耳でしたがそれも仕様と分かったし、エスケープされていてもデシリアライズはできるので、自分としては回避する必要は感じてません。 どうしても読めないと困るという客の要求とかがあればその限りではありませんけど・・・ エスケープの他にも、デフォルトでは camel casing になるとか、デシリアライズに大文字小文字の区別をすることとか、知らないとハマることがあるのは困りましたけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問