【问题标题】:Why is string not escaped?为什么字符串没有转义?
【发布时间】:2020-10-18 10:56:55
【问题描述】:

考虑以下示例:

string s = "this is formatted \" string \"";

当我在我的 web api 方法中将此作为纯字符串返回时:

return Ok(s)

它产生以下输出

这是格式化的“字符串”

但如果我将它作为对象返回

return Ok(new {
  myStr = s
})

它不会正确转义字符串并返回以下输出

{
    "myStr ": "this is formatted \" string \""
}

理想情况下我想要

{
    "myStr ": "this is formatted " string "
}

我需要html字符串的格式,上面的例子只是为了演示。

【问题讨论】:

  • JSON 格式化程序不会为您这样做,也不应该这样做。您需要使用 WebUtility.HtmlEncode() 之类的内容创建字符串
  • @TiesonT。请检查编辑。
  • 你想要的是一个无效的 JSON 响应,这就是引号被转义的原因
  • "myStr ": "this is formatted " string " 是格式错误的 JSON 属性。您希望它为 "myStr ": "this is formatted \" string \"",以便在解析时属性的值为 this is formatted " string "。

标签: c# html asp.net json asp.net-core


【解决方案1】:

当您在源代码中使用字符串文字(JSON 就是这样!)时,您需要使用一些分隔符,以便指示文字开始和结束的位置。通常为此使用双引号 (")。

但是当字符串文字应该包含与用于分隔它的相同字符时,您会遇到问题。解决方案是某种形式的转义。在 C# 中:

string s1 = "这是格式化的\"字符串\".";
string s2 = @"这是格式化的 "" string "".";

您的单字符串响应不需要分隔符,因为只发送了字符串的内容。所以没有冲突,所以不需要转义。

您的 JSON 响应包含的信息不仅仅是字符串内容,因此它需要对这些内容进行分隔。因此,您会遇到通过转义解决的内容分隔符问题。

这里很重要的一点是,转义只是在源代码(或 JSON)中,字符串的内存值只包含那个引号,没有额外的转义字符。尝试获取字符串值的长度:不计算反斜杠,因为它们实际上并不存在。此外,当您使用字符串值(在某处打印)时,您不会看到转义。

旁注:调试器(例如 Visual Studio 中的调试器)可能会以您可以在源代码中使用的格式显示字符串内容 - 包括所需的转义。这只是调试器显示值的方式,而不是真实值。

底线:您可以忽略该 JSON 中的转义,将使用正确的值。

【讨论】:

    【解决方案2】:

    不是问题,是正常的。

    因为string s = "this is formatted \" string \""; 是强类型字符串,而您从 API 返回一个值。因此,当它被序列化时,结果将是this is formatted "string",它不会被字符串化。

    但是如果你从 API 返回对象,如下所示:

    return Ok(new {
      myStr = s
    })
    

    那么result就是json对象,所以myStr会是stringfied字符串,因为它包含"符号。

    因为

    1. 如果字符串以"(双引号)开头,则不包含另一个",但包含\"或'。
    2. 如果字符串以'(单引号)开头,则不包含另一个',但包含\'或"。

    你可以看看:

    1. JavaScript Strings
    2. The real difference between ‘single quotes’ and “double quotes” in JavaScript

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 2021-02-23
      • 2022-01-21
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2015-10-16
      相关资源
      最近更新 更多