如何使 JSON 解析包含单引号的 JSON 字符串



我正在使用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(""", "\""))");

最新更新