Использование jquery.parseJSON с JavaScriptSerializer (как получить экранирование двойными кавычками)

#jquery #asp.net #json #jquery-templates

#jquery #asp.net #json #jquery-шаблоны

Вопрос:

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

У меня есть простая функция, которая загружает шаблон:

 function templateLoader(templateID, containerID, serializedData) {
    var json = $.parseJSON(serializedData);
    $("#"   templateID).tmpl(json).appendTo("#"   containerID);
};
  

Это сбой, говорящий о недопустимости JSON. Вот как выглядит вызывающий объект:

 <script type='text/javascript'>
jQuery(function () {
    templateLoader('questionTemplate', 
      'questionContainer', 
      '[{"ID":1,"Text":"something with an escaped "double quote" and a single quote does the unicode versionu0027s end of string"}]');
});
</script>
  

JSON создается вызовом JavaScriptSerializer.serialize() и выводится в ASP.NET Просмотр MVC с помощью <%= JavaScriptSerializer.serialize(модель.вопросы) %>

Сам JSON проходит различные тесты проверки JSON.

Я понимаю, что сам javascript экранирует двойные кавычки, оставляя двойные кавычки открытыми для вызова parseJSON() jQuery.

Мой вопрос в том, где лучше всего это исправить? Должен ли я после обработки вызова JavaScriptSerializer serialize добавить дополнительное экранирование или перейти с экранирования на выполнение «замен»? Похоже, что это было бы более распространенной проблемой.

Ответ №1:

Если вы встраиваете его, зачем использовать JSON или JSON.parse вообще? Почему не просто литералы:

 templateLoader('questionTemplate', 
  'questionContainer', 
  [{"ID":1,"Text":"something with an escaped "double quote" and a single quote does the unicode versionu0027s end of string"}]);
  

Очевидно, что вы должны внести соответствующие изменения templateLoader . Вы можете изменить serializedData на json (за исключением того, что название вводит в заблуждение, поскольку json на самом деле это массив, не строка JSON), затем удалить первую строку функции.

Комментарии:

1. Это правда, просто используйте сериализуемый необработанный литерал, шаблон jQuery примет его как есть, нет необходимости в дальнейшем разборе. Спасибо!

Ответ №2:

(для кого-то, кто борется с той же проблемой)

Использовать HttpUtility.JavaScriptStringEncode

Ваш серверный тег станет похожим

 <%= HttpUtility.JavaScriptStringEncode(JavaScriptSerializer.serialize(model.questions)) %>
  

Ответ №3:

Можете ли вы попробовать это?

 <script type='text/javascript'>
jQuery(function () {
    templateLoader('questionTemplate', 
      'questionContainer', 
      '[{"ID":1,"Text":"something with an escaped \"double quote\" and a single quote does the unicode versionu0027s end of string"}]');
});
</script>
  

Комментарии:

1. Да, это действительно работает. Хотя, мой вопрос на самом деле заключается в том, как наилучшим образом выполнить эту кодировку. С тех пор я использую класс JavaScriptSerializer в .NET. Я, конечно, могу обработать то, что он делает, и добавить дополнительные обратные косые черты, но избегать escape как в C #, так и в Javascript неудобно, поэтому любопытно, нашли ли другие лучшие решения.