экранирование строки для json приводит к операции на стороне сервера asp.net - PullRequest
0 голосов
/ 14 октября 2010

У меня есть операция на стороне сервера, вручную генерирующая некоторый ответ json. Внутри json есть свойство, которое содержит строковое значение.

Какой самый простой способ избежать строкового значения, содержащегося в этом результате json?

Итак, это

string result = "{ \"propName\" : '" + (" *** \\\"Hello World!\\\" ***") + "' }";

превратится в

string result = "{ \"propName\" : '" + SomeJsonConverter.EscapeString(" *** \\\"Hello World!\\\" ***") + "' }";

и результат в следующем json

{ \"propName\" : '*** \"Hello World!\" ***' }

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Прежде всего я нахожу идею реализовать сериализацию вручную не очень хорошей. Вы должны делать это чаще всего только для учебы или у вас есть другая очень важная причина, по которой вы не можете использовать стандартные классы .NET (например, использование должно использовать .NET 1.0-3.0 и не выше).

Теперь вернемся к вашему коду. Результаты, которые вы производите в настоящее время не в формате JSON. Вы должны поместить имя свойства и значение свойства в двойные квоты:

{ "propName" : "*** \"Hello World!\" ***" }

Как вы можете прочитать на http://www.json.org/ двойную квоту не только для символа, который должен быть экранирован. Символ обратной косой черты также должен экранироваться. Вы можете подтвердить результаты JSON на http://www.jsonlint.com/.

Если вы осуществляете десериализацию также вручную, вы должны знать, что есть еще символы, которые могут быть аббревиатурно экранированными до \" и \\: \/, \ b, \ f, \ n, \ r, \ t и \ u после 4 шестнадцатеричных цифр.

Как я написал в начале своего ответа, лучше использовать стандартные классы .NET, такие как DataContractJsonSerializer или JavaScriptSerializer . Если вам нужно использовать .NET 2.0 и выше, вы можете использовать Json.NET .

0 голосов
/ 15 октября 2010

Вы можете попробовать что-то вроде:

string.replace(/(\\|")/g, "\\$1").replace("\n", "\\n").replace("\r", "\\r");
...