【问题标题】:How to convert a string to JSON friendly string?如何将字符串转换为 JSON 友好字符串?
【发布时间】:2019-10-23 19:28:43
【问题描述】:

我有一个字符串(文本),我想使用 JSON 解析器对其进行转换,使其对 javascript 友好。

在我的视图页面中,我有一些看起来像这样的 javascript:

var site = {
      strings: {
        addToCart: @someValue,

所以@someValue 应该是 javascript 安全的,例如双引号、需要的转义字符等。

该值@someValue 是一个字符串,但它必须是 javascript 友好的,所以我想使用 JSON 解析它。

新的 System.Text.Json 有什么东西吗?

我试过了:

return System.Text.Json.JsonDocument.Parse(input).ToString();

但这不起作用,因为我的文本只是一个字符串,而不是 JSON 字符串。

还有其他解析方法吗?

【问题讨论】:

    标签: c# json .net-core


    【解决方案1】:

    转义字符串以使其成为 JSON 安全的规则如下:

    • 退格替换为 \b
    • 换页符替换为 \f
    • 换行符替换为\n
    • 回车替换为 \r
    • 制表符替换为 \t
    • 双引号替换为\"
    • 反斜杠替换为 \\

    虽然这不是绝对必要的,但任何非网络安全字符(即任何非 ASCII 字符)都可以转换为其转义的 Unicode 等价物,以避免潜在的编码问题。

    由此,创建自己的转换方法非常简单:

    public static string MakeJsonSafe(String s)
    {
        var jsonEscaped = s.Replace("\\", "\\\\")
                           .Replace("\"", "\\\"")
                           .Replace("\b", "\\b")
                           .Replace("\f", "\\f")
                           .Replace("\n", "\\n")
                           .Replace("\r", "\\r")
                           .Replace("\t", "\\t");
        var nonAsciiEscaped = jsonEscaped.Select((c) => c >= 127 ? "\\u" + ((int)c).ToString("X").PadLeft(4, '0') : c.ToString());
        return string.Join("", nonAsciiEscaped);
    }
    

    DotNetFiddle

    (就像我说的,nonAsciiEscaped 阶段可以省略,因为它不是绝对必要的。)

    【讨论】:

    • 不知道有没有内置的方法可以帮我们做这个?
    • @Blankman 我不确定。一方面,在一个设置中需要为 JSON 转义的字符串似乎过于具体,因为它不仅仅是本身被序列化为 JSON 的对象的一部分,所以我想知道经历这些麻烦有什么好处在核心库中包含这样的方法将是(特别是当它被少数真正需要它的人足够容易地自定义实现时)。另一方面,我认为还有很多其他方法过于具体而无法放入核心库中,所以这个方法也可能存在于某个地方。谁知道?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多