Jsonconvert serializeobject не избежал ни одной кавычки - PullRequest
1 голос
/ 09 марта 2019

C #, у меня есть класс Automobile, и в этом классе у меня есть поле vehicleTrim. Я использую JsonConvert.SerializeObject для сериализации этого класса, и он не экранирует одинарную кавычку. Это вызывает проблему, когда я пытаюсь установить значение объекта в сети с помощью функции window.localStorage.setItem.

пример:

public class Automobile
{
    public string vehicleTrim { get; set; }
}

var test = new Automobile()
{
    vehicleTrim = "designer's package"
};

var serialized = JsonConvert.SerializeObject(test, Formatting.None);
// serialized output: {"vehicleTrim":"designer's package"}
// expected output :  {"vehicleTrim":"designer\'s package"}

так что теперь я хочу установить этот объект json в локальное хранилище моей сети, вызвав это

var jsSetScript = $"window.localStorage.setItem('automobile', '{serialized}');";
await Control.EvaluateJavascriptAsync(jsSetScript);

EvaluateJavascriptAsync возвращает эту ошибку, пытаясь прочитать json SyntaxError: Unexpected identifier 's'. Expected ')' to end an argument list.

Я попытался сделать это с помощью экранированной одинарной кавычки, и это было прекрасно. Итак, вопрос в том, как я могу заставить метод serializedobject экранировать одинарную кавычку?

1 Ответ

1 голос
/ 09 марта 2019

"\'" даже не является допустимым строковым литералом JSON. Из спецификации JSON :

JSON string specification

Таким образом, ' не нужно экранировать, но если это так, он должен выглядеть как "\u0027". Только 8 перечисленных символов имеют специальный сокращенный синтаксис. (Подробнее см. RFC 8259 .)

Если "\u0027" соответствует вашим потребностям, то настройка JsonSerializerSettings.StringEscapeHandling на StringEscapeHandling.EscapeHtml должна помочь. Из документов :

Перечисление StringEscapeHandling

Определяет, как экранируются строки при написании текста JSON.

Default           0   Only control characters (e.g. newline) are escaped.
EscapeNonAscii    1   All non-ASCII and control characters (e.g. newline) are escaped.
EscapeHtml        2   HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped.

Таким образом, теперь успешно выполняется следующее:

var settings = new JsonSerializerSettings
{
    StringEscapeHandling = StringEscapeHandling.EscapeHtml,
};
var serialized = JsonConvert.SerializeObject(test, Formatting.None, settings);

Console.WriteLine(serialized);
// Outputs {"vehicleTrim":"designer\u0027s package"}

Assert.IsTrue(!serialized.Contains('\'')); 
// Succeeds

Демонстрационная скрипка здесь .

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