Использование jquery.parseJSON с JavaScriptSerializer (как получить экранирование двойных кавычек) - PullRequest
0 голосов
/ 06 апреля 2011

Я столкнулся с проблемой при отображении шаблона 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 version\u0027s end of string"}]');
});
</script>

JSON создается путем вызова JavaScriptSerializer.serialize () и выводится в представлении ASP.NET MVC с <% = JavaScriptSerializer.serialize (model.questions)%>

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

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

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

Ответы [ 3 ]

3 голосов
/ 12 марта 2012

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

Использование HttpUtility.JavaScriptStringEncode

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

<%= HttpUtility.JavaScriptStringEncode(JavaScriptSerializer.serialize(model.questions)) %>
3 голосов
/ 06 апреля 2011

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

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

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

1 голос
/ 06 апреля 2011

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

<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 version\u0027s end of string"}]');
});
</script>
...