2013-12-18 7 views
1

Итак, у меня есть некоторые JSON данные, которые я создаю в моем контроллере, как так:JSON из Newtonsoft в JavaScript

Notes = JsonConvert.SerializeObject(contact.Notes.OrderBy(x => x.DateLogged).Select(x => new 
      { 
       id = x.Id, 
       date = x.DateLogged, 
       content = x.Content, 
       logged = x.Username 
      })) 

Это тогда будет послана к мнению, в настоящее время, который Постулаты я могу сделать, чтобы достичь результатов иметь переменную содержат данные, что JSon:

var data = '@Html.Raw(Model.Notes)' 

или

var data = JSON.parse('@Html.Raw(Model.Notes)'); 

EDIT

переменная content имеет некоторые "\ п", которые при передаче в представлении с использованием первого выбора сверху генерирует ошибку, говоря

Неожиданное Токен

он только делает это с \n, так что здесь происходит не так? нижний метод не совсем работает.

+2

Считайте сгенерированный источник. – SLaks

+0

Попробуйте один и посмотрите, работает ли это ...? – Mathletics

+0

@Mathletics см. Мои правки ... –

ответ

0

bobince, очевидно, правильно в том, что он говорит, он имеет такое большое значение, благодаря этому.

Однако, мое решение было просто сделать:

var data = @Html.Raw(Model.Notes); 

Потому что, Newtonsoft уже превратили его в соответствующий формат JSON, поэтому все, что нужно сделать, это быть назначен переменной манипулировать.

Я думаю, что захват контента из HTML DOM слишком много для этого.

1
var data = JSON.parse('@Html.Raw(Model.Notes)'); 

Это не сработает - вы не можете разместить литерал JSON внутри строки JavaScript. Любая обратная косая черта в ней будет escape-символом для парсера JavaScript, а не парсером JSON. Символ новой строки выходит как:

var data = JSON.parse('{"content": "abc\ndef"}'); 

что означает строку, которую вы просите JSON для синтаксического анализа является:

{"content": "abc 

def"} 

, который не является действительным, как вы не можете иметь буквальный перевод строки в строку JSON.

Чтобы сделать это с помощью JSON.parse, вам нужно будет JS-string-literal кодировать вывод JSON, чтобы вы получили "abc\\ndef". Альтернативой будет включение JSON непосредственно в блок сценария как var data = @Html.Raw(Model.Notes);, но с этим возникают проблемы с различиями между JS и JSON (в первую очередь символы U + 2028 и U + 2029) и охватывающий контекст HTML (то есть, что последовательность </script делает).

Получение ускользания здесь сложнее, чем кажется, поэтому вам не следует вводить что-либо в блок <script>. Лучше поставить данные JSON на странице в атрибуте data- и прочитать его из DOM; таким образом, вы можете использовать обычную эвакуацию HTML. Razor дает вам по умолчанию.

<div id="notes" data-notes="@Model.Notes"> 

... 

var data = JSON.parse(document.getElementById('notes').getAttribute('data-notes'));