Неожиданный токен в JSON

#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