【问题标题】:Jsonconvert serializeobject not escaping single quoteJsonconvert serializeobject 不转义单引号
【发布时间】:2019-03-08 21:58:20
【问题描述】:

C#,我有一个汽车类,在那个类中我有一个 vehicleTrim 字段。 我使用JsonConvert.SerializeObject 来序列化该类并且它没有转义单引号。 当我尝试通过window.localStorage.setItem 函数在网络中设置对象的值时,这会导致问题。

示例:

public class Automobile
{
    public string vehicleTrim { get; set; }
}

var test = new Automobile()
{
    vehicleTrim = "designer's package"
};

var serialized = JsonConvert.SerializeObject(test, Formatting.None);
// serialized output: {"vehicleTrim":"designer's package"}
// expected output :  {"vehicleTrim":"designer\'s package"}

所以现在我想通过调用 this 将此 json 对象设置为我的 web 的本地存储

var jsSetScript = $"window.localStorage.setItem('automobile', '{serialized}');";
await Control.EvaluateJavascriptAsync(jsSetScript);

EvaluateJavascriptAsync 在尝试读取 json SyntaxError: Unexpected identifier 's'. Expected ')' to end an argument list. 时返回此错误

我用转义的单引号手动尝试了这个,很好。所以问题是如何让 serializedobject 方法转义单引号?

【问题讨论】:

  • 字符串中的单引号字符是有效的 JSON,所以JsonConvert 没有必要也没有理由转义它。如果您打算按照您的方式将其嵌入到eval 字符串中,您将不得不在序列化后自己手动转义它。 (即serialized.Replace("'", "\\'");
  • hmm i c 所以我将它嵌入到 eval 中的方式是粗略的。猜想我不得不手动逃离它。谢谢!

标签: c# json serialization


【解决方案1】:

"\'" 甚至不是有效的 JSON 字符串文字。来自JSON spec

因此' 不需要转义,但如果是,则必须显示为"\u0027"。只有列出的 8 个字符具有特殊的缩写转义语法。 (详情请见RFC 8259。)

如果"\u0027" 满足您的需求,那么将JsonSerializerSettings.StringEscapeHandling 设置为StringEscapeHandling.EscapeHtml 应该可以解决问题。来自docs

StringEscapeHandling 枚举

指定在编写 JSON 文本时如何对字符串进行转义。

Default           0   Only control characters (e.g. newline) are escaped.
EscapeNonAscii    1   All non-ASCII and control characters (e.g. newline) are escaped.
EscapeHtml        2   HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped.

因此,以下现在成功了:

var settings = new JsonSerializerSettings
{
    StringEscapeHandling = StringEscapeHandling.EscapeHtml,
};
var serialized = JsonConvert.SerializeObject(test, Formatting.None, settings);

Console.WriteLine(serialized);
// Outputs {"vehicleTrim":"designer\u0027s package"}

Assert.IsTrue(!serialized.Contains('\'')); 
// Succeeds

演示小提琴here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多