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

Javascript 如何让JSON解析包含单引号的JSON字符串,javascript,asp.net,json,Javascript,Asp.net,Json,我正在ASP中使用JsonConvert.SerializeObject序列化数组。数组包含包含符号(如单引号)的文本。转换工作正常,直到我尝试使用JSON.parse在JavaScript中解析它。当它得到单引号时失败。我希望尽可能避免手动删除单引号 以下是MVC代码: SheetsArr=JsonConvert.serialized对象(张) 以下是JS代码: var SheetsArr=JSON.parse('@Html.Raw(@Model.Sheets)') 这是Chrome中的错误消

我正在ASP中使用JsonConvert.SerializeObject序列化数组。数组包含包含符号(如单引号)的文本。转换工作正常,直到我尝试使用JSON.parse在JavaScript中解析它。当它得到单引号时失败。我希望尽可能避免手动删除单引号

以下是MVC代码:

SheetsArr=JsonConvert.serialized对象(张)

以下是JS代码:

var SheetsArr=JSON.parse('@Html.Raw(@Model.Sheets)')

这是Chrome中的错误消息:


Uncaught SyntaxError:missing)在参数列表之后

不需要尝试在JS中将数据作为字符串处理并再次解析,只需将值作为数组文本直接注入JS即可。由于JSON是JS对象文字语法的子集,因此将其视为文字。不要认为您甚至需要
Html.Raw()
命令

简单地尝试

var SheetsArr = @Model.Sheets;
(我在这里假设,在C中,您在返回模型的
SheetsArr
属性之前,已将C#
SheetsArr
变量指定给该属性。)

然后,这就消除了JSON中的单引号字符串被JSON字符串中的单引号弄乱的问题

为了说明这一点,我们假设
Model.Sheets
包含如下JSON字符串:

[{ "SomeProp": "Hello, 'Friend'"}, { "SomeProp": "Hello again"}]
您可以看到单引号

在原始代码中,使用该字符串执行Razor代码将产生以下JavaScript:


var SheetsArr=JSON.parse('[{“SomeProp”:“Hello,'Friend'},{“SomeProp”:“Hello reach”}')我们在应用程序中基本上是这样做的,以实现相同的目标

在控制器中:

var serializerSettings=new JsonSerializerSettings
{
ContractResolver=新的CamelCasePropertyNamesContractResolver(),
};
modal.Sheets=JsonConvert.SerializeObject(工作表,serializerSettings);
他认为:

var SheetsArr=“@Html.Raw(@Model.Sheets.Replace(“\”,“\ \ \”)”);

如果要将字符串作为JSON传递并试图解析它,则需要转义字符串中的任何特殊字符。我不认为单引号是个问题,这篇文章列出了需要转义的特殊字符:()您可以在JSON.parse的值中使用backtick(``)字符作为特殊字符。我不确定转义特殊字符的确切含义。当JSON在控制器中被转换为迭代字符串中的每个字符并替换特殊字符时,会发生这种情况吗?这种方法被证明是最一致的。我用XHR把数据拉下来,然后思考MVC有什么意义。我的很多项目似乎都是MVC/SPA混合的。MVC是初始加载,XHR负责记录更改。@dave88很高兴它能为您工作。我也做了一些类似的注入——当页面加载时,允许您在JS中准备好数据。正如您所说,它避免了额外的AJAX调用来单独获取它。我发现,以这种方式将其作为文本注入是迄今为止最简单、最可靠的方法,而且涉及的代码量最少!事实上,这并不完全“达到同样的效果”。在代码中,JS
sheetsArr
变量将是字符串,而不是对象。它仍然需要解析才能有用。根据这个问题,我们的目标是生成一个对象(或者从技术上讲,在本例中是一个数组,但肯定不是一个字符串)。我刚刚更改了这里的变量名,以便与您的代码相关。我想现在我看到,我们只是在逃避双引号,而不是用单引号做任何事情,所以我明白你的意思。这不是我的代码,我没有问这个问题:-)。但无论如何,在您的示例中,您不需要使用单引号,因为外部字符串文字是用双引号包装的,因此只有字符串中的双引号才能将其打断。但我的观点并不是说你的代码本身有什么问题,只是它并没有完全符合问题的要求。