我正在使用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
与其尝试将数据视为 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 是这样的(我添加了控制台命令,以便您可以看到结果):
var SheetsArr = [{ "SomeProp": "Hello, 'Friend'"}, { "SomeProp": "Hello again"}];
console.log(SheetsArr);
我们基本上在我们的应用程序中这样做来实现同样的事情
在控制器中:
var serializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
};
modal.Sheets = JsonConvert.SerializeObject(Sheets, serializerSettings);
在视图中:
var SheetsArr = "@Html.Raw(@Model.Sheets.Replace(""", "\""))");