【问题标题】:Replacing escape characters from JSON替换 JSON 中的转义字符
【发布时间】:2013-05-17 12:58:20
【问题描述】:

我想用空格替换 JSON 字符串中的“\”字符。 我该怎么做?

【问题讨论】:

标签: c# json string replace


【解决方案1】:

只需获取 json 字符串并将其设为 String.Replace()

string JsonContentFixed = JsonContentString.Replace(@"\", " ");

【讨论】:

  • 我想知道@符号在“\”之前的原因Replace(@"\", " ")已经是一个字符串,那为什么需要呢?请对此有所了解。
  • 所以你不必为栏“\”使用换行符。如果你不使用 @ 你将不得不使用 .Replace("\\", " ");
【解决方案2】:

试试这个

json.Replace(@"\", " ")

【讨论】:

    【解决方案3】:

    您可以使用Replace()

    string variable = "{\"data\": {\"id\": \"1\",\"name\": \"jon\"}}";
    Console.WriteLine(variable.Replace("\\", " "));
    

    【讨论】:

    • 这段代码不会编译,如果你尝试替换“\\”为什么你的变量文本只包含一个反斜杠? "you JSON \" 应该真的是 "you JSON \\"。
    【解决方案4】:

    基本上你是在问如何在 C# 中替换反斜杠。

    你必须使用String.Replace 方法。文档告诉我们:

    String.Replace 方法(字符串,字符串)

    返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定字符串。

    因此,您的字符串将采用Replacemethod 返回的值:

    jsonString= jsonString.Replace(@"\"," ");
    

    【讨论】:

      【解决方案5】:

      C# 字符串赋值会为您执行此操作,尽管如果名称或值包含 \,它将被双重转义。 正确的方法是使用 variable.Replace("\\\\","\\");或 variable.Replace(@"\\",@"\"); 这将删除双转义 \ 字符,保留 REQUIRED \ 值。例如,如果 JSON 包含“Domain\Username”,这将返回为 \"Domain\\\\Username\" 将其分配给字符串将导致您将拥有 Domain\\Username

      【讨论】:

        【解决方案6】:

        我发现从 JSON 字符串中删除所有转义字符的最简单和最好的方法是将字符串传递给 Regex.Unescape() 方法。 此方法返回一个没有转义符的新字符串,甚至删除了 \n \t 等。

        有关详细信息,请参阅此 MSDN 文章Regex.Unescape Method (String) (System.Text.RegularExpressions)

        【讨论】:

        • 这是唯一正确的答案。当json内容中有\时,盲目地将所有\字符替换为空是行不通的。
        • 我知道这个问题有点老了,但有没有人建议将 JSON 反序列化为字符串的原因?喜欢:var json = JsonConvert.DeserializeObject<string>(escapedJson); JSON 序列化器肯定是为此而构建的吗?
        • 我同意@JamieTwells。首先,反序列化为另一个字符串(未转义的字符串):string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);(可以重复多次),然后,您可以再次反序列化为目标类型:MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);
        • 不起作用。 str = Regex.Unescape("\r \n a"); >str "\r \n a"
        • @WULF 您正在使用转义,但结果字符串不包含转义。试试Regex.Unescape("\\r \\b a");
        【解决方案7】:

        Regex.Unescape() 方法在大多数情况下都可以正常工作,但某些特殊情况需要自定义替换。例如。 Regex.Unescape() 将生成实际的换行符,即not supported in JSON

        未转义的 JSON:

        {"comments_count":27,"comments":"<a name=\"comments\"><\/a>\n\n\t\n\t\n\t\t\n\t<div class=\"CommentsList\">\n\t\t<strong>COMENTARII<\/strong>\n\t\t"}
        

        Regex.Unescape

        {"comments_count":27,"comments":"<a name="comments"></a>
        
        Replacements
            <div class="CommentsList">
                <strong>Comments</strong>
        "}
        

        自定义替换

        private string SanitizeReceivedJson(string uglyJson)
        {
            var sb = new StringBuilder(uglyJson);
            sb.Replace("\\\t", "\t");
            sb.Replace("\\\n", "\n");
            sb.Replace("\\\r", "\r");
            return sb.ToString();
        }
        
        {"comments_count":27,"comments":"<a name=\"comments\"><\/a>\n\n\t\n\t\n\t\t\n\t<div class=\"CommentsList\">\n\t\t<strong>COMENTARII<\/strong>"}
        

        【讨论】:

        • 不起作用。 str = Regex.Unescape("\r \n a"); &gt;str "\r \n a"
        • @WULF 看起来您在提到 Regex.Unescape 的每个答案中都添加了该评论,而此答案明确将 \r \n\t 称为它不处理的字符。
        【解决方案8】:

        如果 json 对象是字符串,在 .Net 中会添加转义“\”字符,如果要清理 json 字符串,JObject.Parse({string}) 如下代码所示 sn-p清理得很好:

        var myJsonAsString = "{\"Name\": \"John\", \"LastName\": \"Doe\", \"Age\": 199 }";
        
        var myCleanJsonObject = JObject.Parse(myJsonAsString);
        

        应该给我们一个干净的 Json 对象,去掉转义字符。

        {
        "Name": "John",
        "LastName": "Doe",
        "Age": 199
        }
        

        【讨论】:

        • 在我的情况下,我必须在序列化对象后这样做。字符串脏 = JsonConvert.SerializeObject(jsonObject); return JObject.Parse(dirty).ToString();
        • 来自var myJsonAsString 的原始字符串中已经没有\​​(反斜杠)。要在字符串中获取反斜杠,请使用 "\\"。然后会抛出,因为JObject.Parse 会考虑反斜杠,除非后面跟着合法的转义字符、非法的 JSON(正确如此)。
        【解决方案9】:

        这种类型的转义字符串通常是在您尝试将 JSON 字符串再次编码为 JSON 时生成的。 这会导致类似“各种级别的序列化”

        解决方案:

        • 首先需要反序列化转义后的字符串,但不是反序列化为目标CLR类型,而是反序列化为另一个字符串
        • 如有必要,再次重复反序列化为字符串类型。
        • 然后对目标类型执行最终反序列化:

        代码:

        // Initial example json string:  "\"{\\\"Property1\\\":1988,\\\"Property2\\\":\\\"Some data :D\\\"}\""    
        
        // First, deserialize to another string (unescaped string).
        string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);
        // Result: "{\"Property1\":1988,\"Property2\":\"Some data :D\"}"
        
        // Second, deserialize to another string, again (in this case is necessary)
        var finalUnescapedJsonString = JsonConvert.DeserializeObject<string>(unescapedJsonString);
        // {"Property1":1988,"Property2":"Some data :D"}   This time prints a final, unescaped, json string:
        
        // Finally, perform final deserialization to the target type, using the last unescaped string.
        MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);
        

        【讨论】:

        • 这种方法让我崩溃了
        • 最佳方法。 (Y)
        • 这确实有效!就我而言,我只需要一个反序列化步骤,而不是两个。
        • 老兄 - 多亏了你,我在 3rd 方 API 中发现了一个真正令人讨厌的错误!
        【解决方案10】:

        在 c# 中,您只有一种方法可以创建标准 JSON 结果:

        您必须使用自定义属性名称添加一个类,然后返回 Json(myClassForJsonResult) 作为底部代码:

        public ActionResult testJsonData()
        {
            var myClassForJsonResult=new YourClassOfYourCustomProperties();
            myClassForJsonResult.FirstPropertyStringType="first";
            myClassForJsonResult.SecondPropertyIntType=2;
        
            return Json(myClassForJsonResult);
        }
        

        类定义:

            public class YourClassOfYourCustomProperties
            {
                public string FirstPropertyStringType{ get; set; }
                public int SecondPropertyIntType{ get; set; }
            }
        

        【讨论】:

          【解决方案11】:

          你可以使用 Regex.Unescape(yourEscapedString);

          【讨论】:

          • 不起作用。 str = Regex.Unescape("\r \n a"); &gt;str "\r \n a"
          猜你喜欢
          • 1970-01-01
          • 2012-04-07
          • 2010-10-07
          • 2015-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多