从Newtonsoft到JavaScript的JSON

时间:2013-12-18 20:26:59

标签: javascript asp.net-mvc json

所以,我有一些我在控制器中创建的json数据,如下所示:

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)');

修改

content变量包含一些“\ n”,当使用上面的第一个选项传递给视图时会产生错误,说

  

意外令牌

它只与\n一起使用,所以这里出了什么问题?底部方法不太有用。

2 个答案:

答案 0 :(得分:2)

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

这不起作用 - 您不能将JSON文字放在JavaScript字符串中。其中的任何反斜杠都将是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'));

答案 1 :(得分:0)

bobince在他所说的内容显然是正确的,它非常有意义,谢谢你。

但是,我的解决方案就是:

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

因为,Newtonsoft已经将它转换为适当的JSON格式,因此需要做的就是将其分配给要操作的变量。

我认为从HTML DOM中获取内容对此来说有点太多了。