我正在使用JsonConvert.SerializeObject在ASP中序列化数组。数组包含包含符号的文本,例如单引号。转换正常,直到我尝试使用JSON.parse在JavaScript中对其进行解析。它获得单引号时失败。我希望避免在可能的情况下手动删除单引号。
这是MVC代码:
SheetsArr = JsonConvert.SerializeObject(Sheets);
这是JS代码:
var SheetsArr = JSON.parse('@Html.Raw(@Model.Sheets)');
这是Chrome中的错误消息:
Uncaught SyntaxError: missing ) after argument list
答案 0 :(得分:2)
您无需将数据视为JS中的字符串并再次进行解析,而只需将值作为数组文字注入到JS中即可。由于JSON是JS对象文字语法的子集,因此将其视为文字。不要以为您甚至不需要Html.Raw()
命令。
简单尝试
var SheetsArr = @Model.Sheets;
(我假设在C#中,在返回模型之前,已将C#SheetsArr
变量分配给模型的Sheets
属性。)
然后,这消除了JS中的单引号字符串被JSON字符串中的单引号所掩盖的问题。
为说明这一点,我们假设Model.Sheets
包含这样的JSON字符串:
[{ "SomeProp": "Hello, 'Friend'"}, { "SomeProp": "Hello again"}]
您可以看到单引号。
在您的原始代码中,执行包含该字符串的Razor代码将产生以下JavaScript:
var SheetsArr = JSON.parse('[{ "SomeProp": "Hello, 'Friend'"}, { "SomeProp": "Hello again"}]');
如您所见,中间的单引号现在是一个问题,因为它们终止了外部字符串文字引号。
如果我们只是按照我建议的方式直接注入JSON,那么生成的JS是这样的(我已经添加了console命令,以便您可以看到结果):
var SheetsArr = [{ "SomeProp": "Hello, 'Friend'"}, { "SomeProp": "Hello again"}];
console.log(SheetsArr);
答案 1 :(得分:-1)
我们本质上是在应用程序中执行此操作以实现相同的目的
在控制器中:
var serializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
};
modal.Sheets = JsonConvert.SerializeObject(Sheets, serializerSettings);
在视图中:
var SheetsArr = "@Html.Raw(@Model.Sheets.Replace("\"", "\\\""))");