【问题标题】:How to make JSON parse a JSON string containing single quotation marks如何让 JSON 解析包含单引号的 JSON 字符串
【发布时间】:2019-10-22 01:26:44
【问题描述】:

我正在使用 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

【问题讨论】:

  • 如果您将字符串作为 JSON 传递并尝试解析它,您需要转义字符串中的任何特殊字符。我不相信单引号应该是一个问题,这篇文章列出了需要转义的特殊字符:(stackoverflow.com/questions/19176024/…)
  • 您可以在 JSON.parse 的值中使用反引号 (``) 字符作为特殊字符
  • 我不确定转义特殊字符的确切含义。这会是在控制器中转换 JSON 以迭代字符串中的每个字符并替换特殊字符时吗?

标签: javascript asp.net json


【解决方案1】:

您可以直接将值作为数组字面量注入 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);

【讨论】:

  • 这种方法被证明是最一致的。它达到了我使用 XHR 将数据拉下来的地步,但随后思考 MVC 的意义何在。似乎我的很多项目都是 MVC/SPA 混合的。 MVC 是初始负载,XHR 负责记录更改。
  • @dave88 很高兴它对你有用。我也做了这种注入 - 允许您在页面加载时在 JS 中准备好数据。正如您所说,它避免了额外的 AJAX 调用来单独获取它。而且我发现以这种方式将其作为文字注入是迄今为止最简单和最可靠的方式,并且涉及的代码量最少。 KISS!
【解决方案2】:

我们基本上在我们的应用中这样做是为了达到同样的目的

在控制器中:

var serializerSettings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
};
modal.Sheets = JsonConvert.SerializeObject(Sheets, serializerSettings);

在视图中:

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

【讨论】:

  • 实际上这并不完全“达到同样的效果”。在您的代码中,JS sheetsArr 变量将是一个字符串,而不是一个对象。它仍然需要解析才能有用。根据问题,目标是生成一个对象(或者在技术上,在这种情况下是一个数组,但肯定不是字符串)。
  • 不,在我们的代码中,它是一个我们推送到会话存储中的 JSON 对象。我只是在这里更改了变量名以与您的代码相关。我想现在我看我看到我们只是在转义双引号而不用单引号做任何事情,所以我明白你的意思。
  • 这不是我的代码,我没有问这个问题:-)。但无论如何,在您的示例中,您不需要 need 对单引号执行任何操作,因为外部字符串文字包含在双引号中,因此只有字符串中的双引号可能会破坏它。但我的观点并不是你的代码本身有什么问题,只是它并没有完全按照问题的要求。
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多