Проблемы с сериализацией System.Text.Json символов Unicode (например, смайликов) - PullRequest
1 голос
/ 06 ноября 2019

Я обновляю приложение с .NET Core 2.2 до .NET Core 3.0, и новый сериализатор System.Text.Json ведет себя не так, как Newtonsoft в 2.2. На таких символах, как неразрывный пробел (\ u00A0) или символы эмодзи, Newtonsoft (и даже Utf8Json) сериализует их как настоящие символы, а не код Unicode.

Я создал простую .NET Fiddleчтобы показать это.

var input = new Foo { Bar = "\u00A0 Test !@#$%^&*() ?\uD83D\uDCAF 你好" };
var newtonsoft = Newtonsoft.Json.JsonConvert.SerializeObject(input);
var system = System.Text.Json.JsonSerializer.Serialize(input, new System.Text.Json.JsonSerializerOptions
    {
        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, 
    });
var utf8Json = Utf8Json.JsonSerializer.ToJsonString(input);

Console.WriteLine($"Original: {input.Bar} - {input.Bar.Contains('\u00A0')}"); // Original
Console.WriteLine($"Newtonsoft: {newtonsoft} - {newtonsoft.Contains('\u00A0')}"); // Works
Console.WriteLine($"System.Text.Json: {system} - {system.Contains('\u00A0')}"); // Does not work
Console.WriteLine($"Utf8Json: {utf8Json} - {utf8Json.Contains('\u00A0')}"); // Works

https://dotnetfiddle.net/erCaZl

Существует ли свойство Encoder или JsonSerializerOptions для сериализации, как это сделал Newtonsoft?

1 Ответ

1 голос
/ 07 ноября 2019

Это дизайн . Наша цель - обеспечить безопасные значения по умолчанию, поэтому мы избегаем всего, что мы не знаем, является безопасным. По практическим причинам мы не можем обнаружить все безопасные символы, потому что это означает, что мы отправляем большие таблицы и выполняем потенциально нетривиальный поиск.

Если вы действительно настаиваете, вы можете расширить класс JavaScriptEncoder и выбратьзакодированные символы самиЯ бы посоветовал против этого, потому что если вы не будете осторожны, люди могут использовать полезную нагрузку, которая может изменить семантику JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...