#c# #angularjs #json
#c# #angularjs #json
Вопрос:
Я проверил строковый ответ JSON наhttps://jsonformatter.curiousconcept.com / и это говорит о том, что строка JSON допустима.
Ниже приведена функция, которую я использовал для сериализации данных в строку JSON:
private string getJSONData()
{
obj_userSession = new UserSession();
DataTable dtRender = null;
DataView dvRender = null;
obj_userSession = new UserSession();
if (obj_userSession.LoginData != null amp;amp; obj_userSession.EmailsDetails != null)
{
dvRender = new DataView(obj_userSession.EmailsDetails);
dtRender = dvRender.ToTable("EmailsDetails", false, "MessageDate", "SentFrom", "MessageBody", "SentTo", "MLSNumber");
return JsonConvert.SerializeObject(dtRender);
}
return "";
}
И вот ответ от вышеупомянутой функции в виде строки JSON:
[
{
"MessageDate": "2016-04-04T05:42:38.273",
"SentFrom": "Site Team",
"MessageBody": "<html>rn<head>rnt<style type="text/css">rntt.c0 { font-family:'Arial';font-size:10.5pt; }rntt.c1 { margin-left:0pt;margin-top:0pt;margin-right:0pt;margin-bottom:7.5pt; }rnt</style>rn</head>rn<body class="c0">rn<p class="c1">Hi Joe, </p>rn<p class="c1">Testing Site</p>rn<p class="c1">--James</p>rn<p class="c1"></p>rn</body>rn</html>rn",
"SentTo": "James",
"Number": ""
}
]
Мы не получаем никакой ошибки в коде, но результат не отображается в браузере. И получает вышеупомянутую ошибку в инструментах разработчика в браузере.
Если я удалил MessageBody
из функции getJSONData
, чтобы избежать ее сериализации, и удалил код привязки со страницы дизайна для MessageBody
, тогда все работает нормально.
От какого символа я должен экранироваться MessageBody
и как это сделать?
Редактировать Это функция контроллера AngularJS, которую я использовал для получения данных:
$scope.browseListing = function (strURL) {
$scope.getURL(strURL);
$http.post($scope.URL)
.then(function (response) {
$scope.Data = response.data;
if ($scope.IsMap)
$scope.LoadMapData();
if ($scope.IsDetails)
$scope.buildReportURL($scope.Data[0].ListingID);
}, function (response) {
$log.info(response);
});
};
И это привязка к html:
<tr ng-repeat="listing in Data">
<td colspan="6">
<table class="tblListingOuter">
<tr>
<th style="width:20%;">
</th>
<th style="width:80%;">
</th>
</tr>
<tr>
<td><b>Date: </b>{{ listing.MessageDate }}</td>
<td><b>Message: </b></td>
</tr>
<tr>
<td><b>Sent By: </b>{{ listing.SentFrom }}</td>
<td rowspan="3">
<pre contenteditable="true" ng-bind-html="listing.MessageBody | unsafe"></pre>
</td>
</tr>
<tr>
<td><b>Sent To: </b>{{ listing.SentTo }}</td>
</tr>
<tr>
<td><b>MLSNO: </b>{{ listing.MLSNumber }}</td>
</tr>
</table>
</td>
</tr>
Комментарии:
1. Ваш Json неверен, проверьте это на jsonlint.com
2. Вы намеревались поставить точку с запятой в конце вашего JSON?
3. да, если вы удалите его, он пройдет тест на ворсинку
4. @HomrZodyssey, эта точка с запятой добавлена по ошибке при публикации вопроса..
5. Можете ли вы показать код, который вы используете для чтения JSON?
Ответ №1:
В Newtonsoft JsonSerializerSettings
у вас есть свойство StringEscapeHandling
, которое определяет, как экранируются строки при написании json. приведенный ниже код может сработать для вас
var settings = new JsonSerializerSettings();
settings.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
return JsonConvert.SerializeObject(dtRender, settings)
допустимые значения для этого свойства перечислены в документации здесь: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_StringEscapeHandling.htm
вы можете попробовать другие флаги, чтобы заставить его работать
Комментарии:
1. моя ошибка, исправлен код. это происходит, когда игрушка записывает что-то из вашей головы без открытой ide
2. а с другими вариантами? (escapeHTML ? )
3. это работает, но с небольшими изменениями. Я использовал
StringEscapeHandling.EscapeHtml
вместоStringEscapeHandling.EscapeNonAscii
, и он начинает работать…
Ответ №2:
Это всего лишь предположение, но вы можете попробовать дважды экранировать экранируемые символы в теле сообщения, например:
[
{
"MessageDate": "2016-04-04T05:42:38.273",
"SentFrom": "Site Team",
"MessageBody": "<html>\r\n<head>\r\n\t<style type=\"text/css\">\r\n\t\t.c0 { font-family:'Arial';font-size:10.5pt; }\r\n\t\t.c1 { margin-left:0pt;margin-top:0pt;margin-right:0pt;margin-bottom:7.5pt; }\r\n\t</style>\r\n</head>\r\n<body class=\"c0\">\r\n<p class=\"c1">Hi Joe, </p>\r\n<p class=\"c1\">Testing Site</p>\r\n<p class=\"c1\">--James</p>\r\n<p class=\"c1\"></p>\r\n</body>\r\n</html>\r\n",
"SentTo": "James",
"Number": ""
}
]
Комментарии:
1. Я добавил это с помощью str.Replace(«\»,»\\») но не работает. Как это сделать.?
2. ‘<html>\r\n<head>\r \n\t<тип стиля =\ «текст / css\»>\r \n\t\t.c0 { семейство шрифтов: ‘Arial’; размер шрифта: 10,5 пт; }\r \n\t\t.c1 { поле слева: 0pt; поле сверху: 0pt; поле справа:0pt; поле снизу:7,5пт ; }\r\n\t</style>\r\n</head>\r\n<body class=\»c0\»>\r\n<p class=\»c1\»> Привет, Борис, </p>\r\n<p class=\»c1\»> Тестовый веб-портал</p>\r\n<p class=\»c1\»>—Джерри </p>\r\n<p class=\»c1\»></p>\r\n</body>\r\n</html>\r\n
3. Получает ответ выше, и когда я помещаю это в строковую переменную, выдает ошибку «Перевод строки в константу»
4. Вы пробовали полностью удалить символы r, n и t? По крайней мере, попробуйте это в качестве теста, чтобы увидеть, являются ли они причиной проблемы
5. я думаю, что проблема заключалась в том, что
{
не был экранирован (это символ, используемый Json). но все же замена строки — очень неприятное решение, поэтому я предложил решение с настройками для JsonConvert